CoderForce 141C-Queue (贪心+构造)
题目大意:一个队伍,每个人只记得前面比他高的人的个数x。现在将队伍散开,问能否构造出一支满足条件的队伍,如果能,再给每个人一个满足题意的身高。
题目分析:一个一个排,x越少越先排,如果x比已经排好的人数大,那么无解。否则,将这个人放到已经排好的队伍中的第x+1个位置上去,并赋予一个合适的身高,使得前x个人都比他高。
代码如下:
# include<iostream> # include<cstdio> # include<queue> # include<string> # include<algorithm> using namespace std; struct People { string name; int num; People(string p,int a):name(p),num(a){} bool operator < (const People &a) const{ return num<a.num; } }; int n; vector<People>v,ans; bool ok() { ans.clear(); sort(v.begin(),v.end()); for(int i=0;i<n;++i){ if(v[i].num>i) return false; int k=v[i].num; if(k==0){ ans.insert(ans.begin(),People(v[i].name,50001)); continue; } int minn=ans[0].num; for(int j=1;j<k;++j) minn=min(ans[j].num,minn); ans.insert(ans.begin()+k,People(v[i].name,minn-1)); } return true; } int main() { string p; int a; while(~scanf("%d",&n)) { v.clear(); for(int i=0;i<n;++i){ cin>>p>>a; v.push_back(People(p,a)); } if(!ok()) printf("-1\n"); else{ for(int i=0;i<ans.size();++i) cout<<ans[i].name<<' '<<ans[i].num<<endl; } } return 0; }