cf128 D. Numbers(贪心,构造)
题意:
问能否把给定数组重排成一个环,原数组的每个数必须用一次,且相邻的数之差恰为1。
\(n \le 1e5, 1\le a_i \le 1e9\)
思路:
从最小的数开始,每次优先往上走,走不了的话就往下走。
开桶计数之前不必离散化,因为合法情况的极差不会超过n,只需把每个数减去最小数
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, a[N], c[N];
signed main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
for(int i = n; i >= 1; i--) a[i] -= a[1] - 1;
for(int i = 1; i <= n; i++) {
if(a[i] - a[i-1] > 1) return puts("NO"), 0;
c[a[i]]++;
}
int now = a[1]; n--; c[now]--;
while(1)
{
if(c[now+1]) c[++now]--, n--;
else if(c[now-1]) c[--now]--, n--;
else break;
}
if(n || abs(now-a[1]) != 1) puts("NO");
else puts("YES");
return 0;
}

浙公网安备 33010602011771号