1 条题解
-
0
解题思路
解法一
设三条线段的长度为 。如果它们不能构成非退化三角形,那么长度为 或 的线段也不能构成非退化三角形。因此,我们不需要尝试所有组合。如果我们把 作为中间长度,那么我们需要尝试小于等于 的最大 和大于等于 的最小 。最简单的做法是:对线段长度排序,然后检查所有连续的三条线段。
时间复杂度:
解法二
根据解法一中的观察,如果我们尝试构造一个序列,使得排序后任意连续三条线段都构成退化三角形,那么这个序列会是斐波那契数列:。斐波那契数列增长非常快,。这意味着,当 时,答案一定是
"YES"。当 时,我们可以使用朴素的 算法或解法一。设 是满足如下不等式的数:
时间复杂度: 或
代码实现(解法一)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } sort(a.begin(), a.end()); for (int i = 0; i + 2 < n; ++i) { if (a[i] + a[i + 1] > a[i + 2]) { cout << "YES\n"; return 0; } } cout << "NO\n"; return 0; }代码实现(解法二)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } if (n >= 45) { cout << "YES\n"; return 0; } sort(a.begin(), a.end()); for (int i = 0; i + 2 < n; ++i) { if (a[i] + a[i + 1] > a[i + 2]) { cout << "YES\n"; return 0; } } cout << "NO\n"; return 0; }
- 1
信息
- ID
- 6843
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者