acwing周賽 4306. 序列處理
阿新 • • 發佈:2022-03-04
題目
給定一個長度為 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; }