CF1668B Social Distance 题解

传送门

题目大意

  • \(n\) 个人要坐在 \(m\) 个椅子组成的环上面;
  • \(i\) 个人左右要空 \(a_i\) 的位置;
  • 判断能否坐下 \(n\) 个人。

思路

既然是两个人互相空位置,那么两个人隔得位置越相近肯定就越好。我们直接排序一遍,这样子相邻的两个人必然空的位置大小最靠近。由于这些椅子组成了一个环,那么第 \(1\) 个人就会挨着第 \(n\) 个人。我们统计一下至少需要多少个位置,再判断是否匹配条件。

代码

#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;
}
posted @ 2023-10-15 14:24  haokee  阅读(27)  评论(0)    收藏  举报