题目地址:http://codeforces.com/problemset/problem/534/D
思路:把握手次数为i的人标号放入栈s[i]中,当栈非空时,栈顶元素进入房间并让i++。 否则,s[i-1],s[i-2],s[i-3]各出栈一个,并让i-3(代表三人出去比赛)。当所有人都进入房间或者i<0时(对应无解)停止模拟。
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=2e5+50;
int n;
vector<int> ans;
stack<int> S[maxn];
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int x;
scanf("%d",&x);
S[x].push(i);
}
int i=0;
while(1)
{
if(!S[i].empty()) ans.push_back(S[i++].top());
else
{
if(i<3) break;
S[--i].pop(),S[--i].pop(),S[--i].pop();
}
}
if(ans.size()==n)
{
printf("Possible\n");
for(int i=0; i<ans.size()-1; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[ans.size()-1]);
}
else printf("Impossible\n");
return 0;
}