#贪心 #排序 ## 题目大意 - $n$ 个人要坐在 $m$ 个椅子组成的环上面; - 第 $i$ 个人左右要空 $a_i$ 的位置; - 判断能否坐下 $n$ 个人。 ## 思路 既然是两个人互相空位置,那么两个人隔得位置越相近肯定就越好。我们直接排序一遍,这样子相邻的两个人必然空的位置大小最靠近。由于这些椅子组成了一个环,那么第 $1$ 个人就会挨着第 $n$ 个人。我们统计一下至少需要多少个位置,再判断是否匹配条件。 ## 代码 ```cpp #include <iostream> #include <algorithm> using namespace std; using ll = long long; // 开long long const int kMaxN = 5e4 + 1; ll a[kMaxN], t, n, m, ans; int main() { for (cin >> t; t; --t) { cin >> n >> m, ans = 0; for (int i = 1; i <= n; ++i) { cin >> a[i]; } sort(a + 1, a + n + 1); // 从小到大排序一遍 for (int i = 1; i <= n; ++i) { ans += a[i == 1 ? n : i] + 1; // 特判,记得加一 } cout << (ans <= m ? "YES" : "NO") << '\n'; // 判断是否符合条件 } return 0; } ```