Codeforces 534D Handshakes 构造 模拟 贪心

题意:人们依次进大厅,后进来的人会和里面所有的人都握手, 大厅里面有三个人就 其中丧二恩就可以结伴走出大厅。给你每个人进大厅时候握手的次数。让你求一个进场顺序。

解题思路:比赛的时候是用的从后往前推。比较难,发现从前往后直接模拟就行了 。

解题代码:

 1 // File Name: d.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年04月13日 星期一 01时30分17秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #include<queue>
25 #define LL long long
26 
27 using namespace std;
28 int n ;
29 int a[200005];
30 int point[2000005];
31 int ans[200005];
32 queue<int> qu[200000];
33 int main(){
34     scanf("%d",&n);
35     for(int i = 1;i <= n;i ++)
36     {
37         scanf("%d",&a[i]);
38         qu[a[i]].push(i);
39     }
40     int j = 0 ; 
41     for(int i = 1;i <= n;i ++){
42         while(qu[j].empty() && j >= 3)
43             j -= 3; 
44         if(qu[j].empty())
45         {
46             puts("Impossible
");
47             return 0 ; 
48         }
49         ans[i] = qu[j].front();
50         qu[j].pop();
51         ++ j;
52     }
53     puts("Possible
");
54     for(int i = 1;i <= n;i ++)
55         printf(i == 1?"%d":" %d",ans[i]);
56 return 0;
57 }
View Code
原文地址:https://www.cnblogs.com/zyue/p/4423027.html