acwing周赛 4306. 序列处理
题目
给定一个长度为 n 的整数序列 a1,a2,…,an。
我们可以对该序列进行修改操作,每次操作选中其中一个元素,并使其增加 1。
现在,请你计算要使得序列中的元素各不相同,至少需要进行多少次操作。
输入格式
第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
一个整数,表示所需的最少操作次数。
数据范围
前 6 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤3000,1≤ai≤n。
思路+坑点
思路: 简单地贪心
坑点:题中数据范围为1至3000 因此很容易被误导将数组开到3010 其实used数组的范围不一定是1到3000 因为原数经历修改后值可能超过3000
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PII pair<int, string>
const int maxn = 1e6 + 5;
const int INF = 0x3f3f3f3f;
const ll M = 1099511627776;
const int N = 1e5 + 5;
int a[maxn];
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++){
int t;cin>>t;
a[t]++;
}
ll ans1=0;
for(int i=1;i<=maxn;i++){
int ret=a[i]-1;
if(ret>=1){
a[i+1]+=ret;
ans1+=ret;
}
}
cout<<ans1<<endl;
return 0;
}