藍橋杯題目練習 提升篇 [藍橋杯2019初賽]修改數組

[藍橋杯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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章