题意:
让你选择一个0-m的值,求出在经历n次位操作后最大值为多少?
思路:
进行位操作时,每一个位的值是独立的,所以我们可以按下列情况进行计算:
①:如果该位为0时结果该位为1时该位取0。
②:如果该位为0时结果为0且该位为1时结果为1时该位取1。(不超出m的范围,否则取0)
③:如果该位为0和1时结果都为0时该位取0。
输出最大的结果就好了,详情看代码。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll w[65], t;
string s;
int main()
{
ios::sync_with_stdio(false);
int n;
ll m;
cin >> n >> m;
int ji=32;
ll p=1;
for(int i=0;i<ji;i++) //求每一位的权值。
{
w[i]=p;
p=p*2;
}
ll l=0, r=(1LL<<32)-1; //l表示为全为0,r表示位全为1.
for(int i=0;i<n;i++)
{
cin >> s >> t;
if(s=="AND")
{
l=(l&t);
r=(r&t);
}
else if(s=="OR")
{
l=(l|t);
r=(r|t);
}
else
{
l=(l^t);
r=(r^t);
}
}
ll ans=0, pa=0; //ans表示结果,pa表示我取的值
while(ji)
{
ji--;
if((l>>ji)&1) //第①种情况
{
ans=ans+w[ji];
}
else if(((r>>ji)&1)&&w[ji]+pa<=m) //第②种情况
{
pa=pa+w[ji];
ans=ans+w[ji];
}
//第③种情况不需要做处理。
}
cout << ans << endl;
return 0;
}

京公网安备 11010502036488号