题目链接:https://codeforces.com/problemset/problem/534/D
题目大意:有n个人,每个人只有在房间存在ai个没配对的人的时候才能进来,每三个人可以配对,问最后能不能全部配对。
题目思路:由于前面的可以帮助后面的进来,所以尽量先拿大的,然后就从大的开始三个三个拿,直到拿不动
以下是代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
const int MAXN = 5e5+5;
const int MOD = 1e9+7;
int n,x;
vector<int>v[MAXN],ans;
int main()
{
while(~scanf("%d",&n)){
rep(i,0,n)v[i].clear();
ans.clear();
rep(i,1,n){
scanf("%d",&x);
v[x].push_back(i);
}
int flag=0;
rep(i,0,n){
while(v[i].size()==0){
if(i-3<0){
flag=1;
break;
}
v[i-1].pop_back();
v[i-2].pop_back();
v[i-3].pop_back();
i-=3;
}
if(flag)break;
ans.push_back(v[i].back());
}
if(ans.size()<n)puts("Impossible");
else{
puts("Possible");
rep(i,0,n-1){
printf("%d%c",ans[i],i==n-1?'\n':' ');
}
}
}
return 0;
}