[藍橋杯2019初賽]修改數組
題目描述
給定一個長度爲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(1<=N<=100000)
第二行包含N個整數A1,A2,…,AN(1<=Ai<=1000000)
輸出
輸出N個整數,依次是最終的A1,A2,…,AN
樣例輸入 Copy
5
2 1 1 3 4
樣例輸出 Copy
2 1 3 4 5
我自己的代碼,過了80%
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int num[1000001];
bool vis[1000001],flag;
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
vis[i]=false;
}
flag=true;
for(int i=1;i<=n;i++){
flag=true;
while(flag){
//cout<<num[i]<<' '<<vis[num[i]]<<endl;
if(!vis[num[i]]) {
vis[num[i]]=true;
flag=false;
}
else{
num[i]++;
}
}
}
for(int i=1;i<=n;i++){
if(i==1){
cout<<num[i];
}
else{
cout<<' '<<num[i];
}
}
return 0;
}
大佬的代碼:
#include <iostream>
#include <cstring>
using namespace std;
int a[100001];
int b[2000001];
int main()
{
int n;
memset(b,0,sizeof(b));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
while(b[a[i]])
{
int t=a[i];
a[i]+=b[a[i]];
b[t]++;
}
b[a[i]]=1;
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}
參考博客:https://blog.csdn.net/lclovezy/article/details/104583446