题目大意:
给你n,k
一开始啥数字都不知道
让你找到第k小数字
然后你可以询问两个数的或运算的值或与运算
然后给你结果
最多询问2*n次
思路:
对于这个位运算
我们有一个结论就是a+b=a|b+a&b(对每一位数来说)
那么我们可以直接把数组中a1
+a2
,a1
+a3
,a1
+a4
······都求出来
然后再求出a2+a3就可以算出a1
了
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
int a[100010];
int main()
{
int n,k;
cin>>n>>k;
int x;
for(int i=2;i<=n;i++){
cout<<"or 1 "<<i<<endl;
cin>>a[i];
cout<<"and 1 "<<i<<endl;
cin>>x;
a[i]+=x;
}
cout<<"or 2 3"<<endl;
cin>>a[0];
cout<<"and 2 3"<<endl;
cin>>x;
a[0]+=x;
a[1]=(a[2]+a[3]-a[0])/2;//这里a2代表a1+a2,a3同理
for(int i=2;i<=n;i++){
a[i]-=a[1];
}
sort(a+1,a+1+n);
cout<<"finish "<<a[k];
return 0;
}