Codeforces Round #500 (Div. 2) B.And(set)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/81510432

题目链接:http://codeforces.com/contest/1013/problem/B

题意: 给你N个数和一个X,每次你可以选一个数改变这个数(让这个数与x进行&(按位与)运算)。这个操作可以进行任意次,问至少将几个数进行按位与运算才能使得至少有两个数相等,注意:如果生产后的数和原来一样,那么只算一个。

思路:一共就四个答案-1,0,1,2。

  • -1:无解
  • 0 :N个数中本来就有两个数相同(无需再进行运算)
  • 1 :N个数中其中一个数与x进行&(按位与)运算,出现两个数相等
  • 2 :N个数中两个数都与x进行&(按位与)运算,使得这两个数相等

 还有就是:一个数无论与另一个数进行多少次&操作得出的数是相同的(也就是最多进行一次&操作)

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
set<int>s,s1;
int a[200000],x,n;
int main()
{
    cin>>n>>x;
    for(int i = 1; i <= n; i++)
    {
        int t;
        cin>>a[i];
        if(s.count(a[i])){puts("0"); return 0;}
        s.insert(a[i]);
    }
    for(int i = 1; i <= n; i++)
    {
        s.erase(a[i]);
        if(s.count(a[i]&x)){puts("1"); return 0;}
        s.insert(a[i]);
    }
    for(int i = 1; i <= n; i++)
    {
        if(s1.count(a[i]&x)){puts("2"); return 0;}
        s1.insert(a[i]&x);
    }
    puts("-1");
}

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/81510432