2024/11/14

鱼一直摸發表於2024-11-14

修改陣列(藍橋杯)
分數 20
作者 liudan
單位 石家莊鐵道大學
給定一個長度為 N 的陣列 A=[A1,A2,⋅⋅⋅AN],陣列中有可能有重複出現的整數。

現在小明要按以下方法將其修改為沒有重複整數的陣列。

小明會依次修改 A2,A3,⋅⋅⋅,AN。

當修改 Ai 時,小明會檢查 Ai 是否在 A1∼Ai−1 中出現過。

如果出現過,則小明會給 Ai 加上 1;如果新的 Ai 仍在之前出現過,小明會持續給 Ai 加 1,直到 Ai 沒有在 A1∼Ai−1 中出現過。

當 AN 也經過上述修改之後,顯然 A 陣列中就沒有重複的整數了。

現在給定初始的 A 陣列,請你計算出最終的 A 陣列。

輸入格式:
第一行包含一個整數 N。

第二行包含 N 個整數 A1,A2,⋅⋅⋅,AN。

其中,1≤N≤105,1≤Ai​≤106。若輸入資料不合理,則輸出:error

輸出格式:
輸出 N 個整數,依次是最終的 A1,A2,⋅⋅⋅,AN。

輸入樣例:
在這裡給出一組輸入。例如:

5
2 1 1 3 4
輸出樣例:
在這裡給出相應的輸出。例如:

2 1 3 4 5

include

include

include <unordered_set>

using namespace std;

void modifyArray(vector&A){
unordered_set seen;
for(int i=0;i<A.size();i++){
while(seen.find(A[i]) != seen.end()){ //表示元素A[i]在集合seen中,屬於是unordered集合中的一種固定用法了
A[i]++;
}
seen.insert(A[i]);
}
}

int main(){
int N;
cin>>N;

if(N<=0||N>100000){
    cout<<"error"<<endl;
    return 0;
}

vector<int>A(N);
for(int i=0;i<N;i++){
    cin>>A[i];
    if(A[i]<1||A[i]>100000){
        cout<<"error"<<endl;
        return 0;
    }
}

modifyArray(A);
for(int i=0;i<N;i++){
    cout<<A[i];
    if(i<N){
        cout<<" ";
    }
}
return 0;

}