蓝桥杯题目练习 提升篇 [蓝桥杯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

发布了149 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Ace_bb/article/details/104784492