题目传送门
题目意思:
给你一个长度为 n n n 的序列 a i a_i ai,再给一个数 x x x。每一步你可以将序列中的一个数与上 x x x。请问最少要多少步才可以使得序列中出现两个相同的数,如果无解输出 − 1 -1 −1。
思路:
- 首先通过找规律我们发现:一个序列最多与两次 x x x,最少与零次 x x x 就可以出现两个相同的数。
- 那么首先我们就先判断当前序列中是否已经存在两个相同的数了,如果有,就直接输出 0 0 0。
- 如果上述的条件不成立,我们就将序列中的每一个数都与上 x x x 并存入一个数组中,判断原本的序列里和现在与完 x x x 的序列里是否有相同的数,并且它们两个不在同一个位置。如果有,就输出 1 1 1。
- 如果上述的条件还不成立,我们就判断与完 x x x 后的序列中有没有两个同样的数,如果有,就输出 2 2 2。
- 如果以上条件都不成立,就证明无解,输出 − 1 -1 −1。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,x;
const int N=5e5+10;
int a[N],b[N],c[N],d[N];
int main()
{cin>>n>>x;for(int i=1;i<=n;i++){cin>>a[i];b[a[i]]++;}for(int i=1;i<=n;i++){if(b[a[i]]>1)//原本的序列中已有两个相同的数{cout<<0;return 0;}}for(int i=1;i<=n;i++){c[i]=a[i]&x;d[c[i]]++;if(b[c[i]]&&c[i]!=a[i]){//原本的序列与现在的序列中有相同的数并且不在同一个位置cout<<1;return 0;}}for(int i=1;i<=500005;i++){if(d[c[i]]>1){//现在的序列中有相同的数cout<<2;return 0;}}cout<<-1;//无解return 0;
}
完美撒花~