理解题意是关键。。。。
思路:
1、先把A数列排序,用pair或struct,记录好数值和下标的对应关系;
2、然后把A数列最小的值开始填到B数列,第一个最小的值直接填到B就可以了;
3、然后把A数列当前的值和上一个填写值比较,填写较大值到B数列中;
4、利用已经记录好的下标就可以快速定位需要填写在B数列中的那个位置了。
#include <stdio.h>
#include<algorithm>
using namespace std;
const int maxn=300009;
struct ratings
{
int id;
int ra;
int ans;
}s[maxn];
int cmpid(ratings x,ratings y)
{
return x.id<y.id;
}
int cmpra(ratings x,ratings y)
{
return x.ra<y.ra;
}
int main()
{
int n,i;
while(scanf("%d",&n)==1)
{
for(i=1;i<=n;i++)
{
scanf("%d",&s[i].ra);//输入ra
s[i].id=i;//记录id
}
sort(s+1,s+n+1,cmpra);//对ra进行排序
int cur=s[1].ra;
for(i=1;i<=n;i++)
{
if(s[i].ra<=cur)
{
s[i].ans=cur;
cur++;
}
else
{
s[i].ans=s[i].ra;
cur=s[i].ra+1;
}
}
sort(s+1,s+n+1,cmpid);
for(i=1;i<n;i++)
printf("%d ",s[i].ans);
printf("%d\n",s[i].ans);
}
return 0;
}