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;
}

posted @ 2022-01-08 23:58  Bellala  阅读(39)  评论(0)    收藏  举报