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;
}
posted @ 2022-03-04 20:52  kingwzun  阅读(298)  评论(0编辑  收藏  举报