LINK

codeforces546B
luogu remote judge CF546B

思路

其实这道题的思想很简单,就是每次遇到一个没有出现过的的数,就把之前的一个重复的数变成这个数。。。
我的代码可能有点奇怪。。。
我的主要思想是把取到的数的和 - 原来的和,然后就是答案。
具体看代码吧——

代码

#include<cstdio>
#include<queue>
using namespace std;
#define MAXN 3005

int n, ans, t, s;
int nn;
int a[MAXN * 2];

int main(){
    scanf( "%d", &n );
    for ( int i = 1; i <= n; ++i ) scanf( "%d", &t ), a[t]++, s += t, nn = max( nn, t );//哈希计数
    t = 0;
    for ( int i = 1; i <= 6000; ++i ){
        if ( t == 0 && i > nn ) break;
        if ( t > 0 && a[i] == 0 ) t--, ans += i;//把一个该改的数改成这个数
        if ( a[i] > 1 ) t += a[i] - 1;//又多了这么多个待改变的数
        if ( a[i] ) ans += i;//不改变的话也要加哦
    }
    printf( "%d\n", ans - s );
    return 0;
}

louhc