题目大意:
一共有N个人,给你每个人前边比这个人高的数量,让你找一个合法的安排,如果找不到输出-1.
思路:(为了方便描述,我们将h【i】=x设定为第i个人前边有x个人比他高)
1、首先我们按照h【i】从小到大排序,如果有h【i】>=i的情况发现,那么一定说明是无解的。
2、如果有解我们继续分析:
①对于第i个人来讲,其前边比他高的人数有h【i】个,那么前边比他矮的人数有i-1-h【i】个,那么我们可以将第i个人的高度设定为i-h【i】,保证前边一定有i-h【i】-1个比他矮的人。
②那么我们按照排好序的顺序设定第i个人的高度为i-h【i】,但是直接这样设定,会影响前边人的高度,那么对应将当前这个人前边的所有大于等于当前人高度的人的高度都加一即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
char s[15];
int x;
}a[3500];
int cmp(node a,node b)
{
return a.x<b.x;
}
int ans[3500];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%s%d",a[i].s,&a[i].x);
}
sort(a+1,a+n+1,cmp);
int flag=0;
for(int i=1;i<=n;i++)
{
if(a[i].x>=i)flag=1;
ans[i]=i-a[i].x;
for(int j=1;j<i;j++)
{
if(ans[j]>=ans[i])
{
ans[j]++;
}
}
}
if(flag==1)
{
printf("-1\n");
continue;
}
for(int i=1;i<=n;i++)
{
printf("%s %d\n",a[i].s,ans[i]);
}
}
}