1. 程式人生 > 其它 >acwing周賽 4306. 序列處理

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;
}