题意:人们依次进大厅,后进来的人会和里面所有的人都握手, 大厅里面有三个人就 其中丧二恩就可以结伴走出大厅。给你每个人进大厅时候握手的次数。让你求一个进场顺序。
解题思路:比赛的时候是用的从后往前推。比较难,发现从前往后直接模拟就行了 。
解题代码:
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 }