Codeforces Round #500 (Div. 2) [based on EJOI] B. And
- 题意:就是给你一串数和一个X,然后让你通过使用&运算符用一串数中的一个数和X替换,使得一串数中出现两个相同的数。
- 这道题说起来不难思考,但是因为本蒟蒻不知道&如何运行,就卡住了。。。
一定要注意一件事,就是&运算符的使用方法有a&x&x = a.
所以,这道题就变成了判断三个条件:
1.是否是一串数中就有相同的数
2.是否一次替换就有相同的数
3.是否用两次替换才有相同的数
(为什么没有三次及其以上的次数,因为a&x&x = a,则在第三次的替换,就把一串数中的数都替换回去了)
附上代码:
#include<bits/stdc++.h>
using namespace std;
int arr[1000000]= {0};
int c[1000000]= {0};
int a[1000000]= {0};
int main()
{
int n,x;
cin >>n>>x;
int num =0;
int sum =0;
int flag =0;
for(int i=0; i<n; ++i)
{
cin >>a[i];
if(arr[a[i]]==1)
num=1;
arr[a[i]]=1;
}
if(num==1)
cout <<0<<endl;
else
{
for(int i=0; i<n; ++i)
{
int k=0;
k = a[i]&x;
//cout <<k<<"gd"<<endl;
if(arr[k]==1&&k!=a[i])
{
cout <<1<<endl;
flag =1;
return 0;
}
}
if(flag==0)
{
for(int i=0; i<n; ++i)
{
if(c[a[i]&x]==1)
{
cout <<2<<endl;
sum =1;
return 0;
}
c[a[i]&x] = 1;
}
if(sum==0)
cout<<-1<<endl;
}
}
return 0;
}