题目链接: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 }

 

posted on 2015-07-17 21:59  尘埃。  阅读(200)  评论(0编辑  收藏  举报