您的位置:首页 > 其它

Soldier and Badges

2015-07-17 21:59 211 查看
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=173144

题意:

输入n个数,要使这n个数都不相同,且只能加,输出最少要加的多少。

案例:

1)input

4

1 3 1 4

output

1

2)input

5

1 2 3 2 5

output

2

思路分析:

利用插空法。尽量减少循环。

先对数组进行排序,再找出有x个相同的数,且把相同的数存在另一个数组c中。因为这个数组c也是排序的,所以只要找出x个比c大的缺少的数。

最后,只要加上所有数组b中的数减去数组c中的数,就是所要输出的数。

源代码如下:

#include<iostream>
#include<algorithm>
#define max 3000
using namespace std;
int main()
{
int n,a[max],i,count=0,j=0,k,b[max],c[max],x=0;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
k=a[0];
for(i=0;i<n;i++)
if(a[i]==a[i+1])
{
c[x]=a[i];
x++;
}
while(1)
{
for(i=j;i<n;i++)
if(k==a[i])
break;
if(i>=n)
if(k>c[j])
{
b[j]=k;
j++;
}
if(j>=x)
break;
k++;
}
for(i=0;i<x;i++)
count+=b[i]-c[i];
cout<<count<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: