题意:
就是给你n个正整数数(3 <= n <= 10^5), 每个正整数数都不超过10^9, 现在问是否能将这n个数排成一个环, 使得换上相邻两个数的差都是1
表示也不知道解法的正确性如何 , YY了一下
题解:
就是拿出n 个数里面最大的, 然后往小了选, 如果接下来需要的小1的没有了,就跳到比这个数大1 的 , 跑到末尾之后, 看看最后一个是否和第一个相差1 , 感觉这么做能过。。。
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<map>
using namespace std;
map<int, int> mark;
int value[100005], Max, num, n;
int slove()
{
num = 0;
int i = Max;
while(1)
{
if(i == 0) i = 2;
if(num == n) break;
if(mark[i])
value[num++] = i, mark[i] --, i --;
else if(mark[i+2])
value[num++] = i+2, mark[i+2] --, i = i + 1;
else return 0;
}
if(value[n-1] == Max - 1) return 1;
return 0;
}
int main()
{
int a;
while(scanf("%d", &n) != EOF)
{
mark.clear();
Max = -1;
for(int i = 1; i <= n; i++)
{
scanf("%d", &a), mark[a] ++;
if(a > Max) Max = a;
}
if(slove()) printf("YES\n");
else printf("NO\n");
}
}