标签:
题目链接: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中的数,就是所要输出的数。
源代码如下:
1 #include<iostream> 2 #include<algorithm> 3 #define max 3000 4 using namespace std; 5 int main() 6 { 7 int n,a[max],i,count=0,j=0,k,b[max],c[max],x=0; 8 cin>>n; 9 for(i=0;i<n;i++) 10 cin>>a[i]; 11 sort(a,a+n); 12 k=a[0]; 13 for(i=0;i<n;i++) 14 if(a[i]==a[i+1]) 15 { 16 c[x]=a[i]; 17 x++; 18 } 19 while(1) 20 { 21 for(i=j;i<n;i++) 22 if(k==a[i]) 23 break; 24 if(i>=n) 25 if(k>c[j]) 26 { 27 b[j]=k; 28 j++; 29 } 30 if(j>=x) 31 break; 32 k++; 33 } 34 for(i=0;i<x;i++) 35 count+=b[i]-c[i]; 36 cout<<count<<endl; 37 return 0; 38 }
标签:
原文地址:http://www.cnblogs.com/q-c-y/p/4655804.html