BD202321百度之星2023第三场--5题-新材料

题目链接

https://www.matiji.net/exam/brushquestion/21/4347/179CE77A7B772D15A8C00DD8198AAC74

小度最近在研究超导材料,他合成了 N 个新材料排成一排,而每个材料根据基于流程会设置一个编号 P,表示种类。 小度发现相同种类的材料在距离小于等于 K 的情况下会发生发应。
小度想知道哪些种类的材料会发生反应,输出这些种类 P 的异或值。

该题可用简单哈希表存材料所在的位置,与后续相同材料比较,得出结果。

代码注释如下:

#include<bits/stdc++.h>
using namespace std;
const int N=50010;		 
int a[N],m[N],n,k,t=0;	//t用来记录会发生反应的材料m[N] 
map<int,bool>mp;		//用于判重,如果改材料已经被m记录,便不再计算 
int Hash[1000010];		//哈希表 
 
int main()
{
	memset(Hash,-1,sizeof(Hash));//材料编号有可能为零,所以初始化为一 
	
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(Hash[a[i]]==-1){		//材料第一次读入,直接赋初值 
			Hash[a[i]]=i;
		}
		else if(!mp[a[i]]){		//如果材料已经存入m数组,不再判断 
			if(i-Hash[a[i]]<=k){//计算当前位置和上一次记录的距离,并判断材料是否会发生反应 
				m[t++]=a[i];	
				mp[a[i]]=true;
			}
			else{				//否则更新当前材料的最新位置,方便与后续相同材料比较 
				Hash[a[i]]=i;
			}
		}
	}
	int ans=0;					//任何数异或0都等于它本身 
	for(int i=0;i<t;i++){
		ans^=m[i];
	}
	cout<<ans<<endl;			//得出答案 
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值