题目链接:https://vjudge.net/problem/CodeForces-128D 题意:给出一组数,要求将这些数排列成一个环,满足每相邻两个数的差值为1,问能否完成。 思路:先取出最小的数min,作为环中一点,则
题目链接:https://vjudge.net/problem/CodeForces-128D
题意:给出一组数,要求将这些数排列成一个环,满足每相邻两个数的差值为1,问能否完成。
思路:先取出最小的数min,作为环中一点,则如果能够完成排列,该数两侧的数字即为min+1,如果min有多个,则放在min+1旁边,重复这样的过程,使用list可以很容易地完成。
代码如下:
1 #include<cstdio> 2 #include<list> 3 #include<iostream> 4 #include<cmath> 5 #include<unordered_map> 6 using namespace std; 7 int n,arr[100010],book[100010]; 8 unordered_map<int,int> mp; 9 int main(){ 10 scanf("%d",&n); 11 int ha=0,minVal=1000000000; 12 for(int i=1;i<=n;i++){ 13 scanf("%d",&arr[i]); 14 minVal=min(minVal,arr[i]); 15 if(mp[arr[i]]==0) 16 mp[arr[i]]=++ha; 17 book[mp[arr[i]]]++; 18 } 19 int ans=1; 20 list<int> lt; 21 lt.push_front(minVal); 22 book[mp[minVal]]--; 23 int tmpFro=minVal,tmpBac=minVal,nn=n-1; 24 while(1){ 25 if(book[mp[tmpFro+1]]){ 26 book[mp[tmpFro+1]]--; 27 lt.push_front(tmpFro+1); 28 nn--; 29 if(book[mp[tmpFro]]){ 30 book[mp[tmpFro]]--; 31 lt.push_front(tmpFro); 32 nn--; 33 } 34 else tmpFro++; 35 } 36 if(book[mp[tmpBac+1]]){ 37 book[mp[tmpBac+1]]--; 38 lt.push_back(tmpBac+1); 39 nn--; 40 if(book[mp[tmpBac]]){ 41 book[mp[tmpBac]]--; 42 lt.push_back(tmpBac); 43 nn--; 44 } 45 else tmpBac++; 46 } 47 else break; 48 } 49 if(nn==0&&abs(*lt.begin()-*lt.rbegin())==1){ 50 printf("YES"); 51 } 52 else printf("NO"); 53 return 0; 54 }By xxmlala