Soldier and Badges

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

 

你可能感兴趣的:(IE)