记录下好的思路…………^.^
题意:
有N个值: a1-an; 求一个新序列b1-bn,使得任意bi!=bj且bi>=ai且 b1-bn的和最小
我的思路:
先把ai 按从小到大排序,然后维护一个最大值maxn,
当 ai<=maxn 时意味必存在一个aj==ai 所以 maxn=b[ai.id]=maxn+1;
当 ai>maxn,说明ai并没有出现过,maxn=b[ai.id]=ai;
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int v;
int id;
}a[300010];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].v);
a[i].id=i;
}
sort(a,a+n,cmp);
int ans[300010];
ans[a[0].id]=a[0].v;
int maxn=a[0].v;
for(int i=1;i<n;i++)
{
if(a[i].v>maxn)
{
ans[a[i].id]=a[i].v;
maxn=a[i].v;
}
else
{
maxn++;
ans[a[i].id]=maxn;
}
}
for(int i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n-1]);
}
return 0;
}