3G芯片#题解

admin 2024-10-19 18:41:11

Hint1

本题中的数据范围有什么特点?

Hint2

能否不用排序算法和去重算法写出?

Solution

观察本题,可以发现 的范围最大只有 ,这个范围比较小,因此可以创建一个长度为 的数组 st。对于每个 ,我们可以进行标记。具体来说,可以将 st[] 置为 1,表示 在数组中出现过。如果 出现多次,仍然只需标记一次,保证 st[] = 1。通过判断 st[] 是 0 还是 1,就可以确定 是否在数组中出现过。这便解决了去重的问题。

对于排序的问题,我们可以发现,数组下标本身就是有序的,例如,st[1],st[2]...st[]。因此,我们可以从小到大遍历 的范围,从0到。如果 st[​​] 为 1,表示该值出现过,则输出该值;否则,不输出。这样既保证了输出的元素不重复,又保证了它们是有序的。

当然,这道题也可以通过排序算法和去重算法来解决。请自行在网上学习排序算法和去重算法的原理。在 C++ 语言中,可以直接调用标准库函数来解决这个问题,这也体现了 C++ 相对于 C 语言的优势

C语言代码(不用排序+去重算法版本)
#include<stdio.h>
#include<stdlib.h>
int st[1000010],n;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int t;
		scanf("%d",&t);
		st[t]=1;//对于出现过的数标记,这一步解决了去重的问题
	}
	for(int i=0;i<=1000000;i++){//从小到大遍历,解决了排序的问题
		if(st[i]==1){
			printf("%d ",i);
		}
	}
	printf("\n");
}
C++代码(排序+去重算法版本)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
typedef pair<int,int> PII;
void solve(){
	int n;
	cin>>n;
	vector<int>a(n);
	for(int i=0;i<n;i++)cin>>a[i];
	sort(a.begin(),a.end());//排序
	a.erase(unique(a.begin(),a.end()),a.end());//去重
	for(auto i : a)cout<<i<<" ";
}
signed main(){
	int t=1;ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//	cin>>t;
	while(t--)solve();
	return 0;
}