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;
}

  

posted @ 2016-01-28 10:52  20143605  阅读(281)  评论(0编辑  收藏  举报