A. Piles With Stones
水题略
B. And
题意:让输入一个n,一个下,之后输入一个长为n的数组a,可以在a中使a变为a&x,问经过几次变化数组中有相同的数
思路:当数组中有两个相同的数时直接输出0,注意a&x后的数无论在与x经过几次按位与运算都不会发生变化,
该题有特殊情况,在数据相当大时可能出现错误,因此要ans=min(ans,1或2),在这最后系统wa了,难受emmmmm
知识点补充:只有1&1=1
代码:
#include <bits/stdc++.h> using namespace std; int n,x; long long a[200000+10],vis[200000+10]; map<long long,long long>mp; map<long long,long long>mp1; int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>n>>x; mp.clear(); for(int i=0;i<n;i++){ cin>>a[i]; mp[a[i]]++; } map<long long,long long>::iterator it=mp.begin(); for(it;it!=mp.end();it++){ if((it->second)>1){ cout<<"0"<<endl; return 0; } } mp1.clear();int ans=3; for(int i=0;i<n;i++){ int m=a[i]&x; if(mp[m]!=0&&m!=a[i]) { ans=min(ans,1); } else if(mp1[m]!=0){ ans=min(ans,2); } else mp1[m]++; } if(ans==3) cout<<"-1"<<endl; else cout<<ans<<endl; return 0; }
原文地址:https://www.cnblogs.com/Fy1999/p/9393379.html
时间: 2024-10-08 22:23:31