題目傳送門
題目意思:
給你一個長度為 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;
}
完美撒花~