Numbers(CodeForces-128D)【思维/list】

题目链接: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

 

posted @ 2019-10-06 09:59  xxmlala  阅读(169)  评论(0编辑  收藏  举报