Codeforces 141C【构造】

来源:互联网 发布:windows 10声音咋调 编辑:程序博客网 时间:2024/05/01 12:07

题意

有n个在排队,现给出n个人前面有多少个人比他的个数,让你构造这个排列。

思路

一种想法:我们现在知道每个人前面有多少个人,那么我们构造这个人的序列。先把给出的数量进行排序,我们可以知道每个位置之前人比他高数量最多的情况是0,1,2,3,4,5,6,7...,如果不满足直接输出”-1”;然后我们
直接模拟下来,把每个人都放到 (pos=+1) 位置,然后每个人的高度就是 INF(pos=)

Code:

#include<iostream>#include<cstdio>#include<cstring>#include<stack>#include<map>#include<queue>#include<cmath>#include<algorithm>#include<deque>using namespace std;typedef long long LL;//#pragma comment(linker, "/STACK:102400000,102400000")const double PI = acos(-1.0);const double eps = 1e-6;const int N = 3e3+10;const int INF=1e9;struct asd{    char name[15];    int num;}p[N];int mp[N];int n,cnt[N];bool cmp(asd x,asd y){    return x.num<y.num;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)        scanf("%s%d",p[i].name,&p[i].num);    sort(p+1,p+n+1,cmp);    memset(cnt,-1,sizeof(cnt));    for(int i=1;i<=n;i++){        if(p[i].num>i-1){            puts("-1");            return 0;        }        int pos=p[i].num+1;        int temp,t;        temp=cnt[pos];        cnt[pos]=i;        mp[i]=pos;        t=pos+1;        while(temp!=-1)        {            int tt=cnt[t];            cnt[t]=temp;            mp[temp]=t;            temp=tt;            t++;        }    }    for(int i=1;i<=n;i++)        p[cnt[i]].num = INF-i+1;    for(int i=1;i<=n;i++)        printf("%s %d\n",p[i].name,p[i].num);    return 0;}
原创粉丝点击