起床困难综合症
题目链接
题目大意
现在可以任选一个在0到m之间的数,给你n个位操作,从第一个操作到最后一个,要使最后的结果最大。
题解
贪心
从高位向低位贪心,枚举每一位是否为0或1,并判断是否在m的范围内,一直取到最后,记录结果就行。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 100005
using namespace std;
unsigned int n,m,a[maxn];
char s[maxn][5];
bool Last(int p,int pos)
{
for (int i=0;i<n;i++)
{
int c=a[i]&(1<<pos);
if (c) c=1;
if (s[i][0]=='A') p=p&c;
else if (s[i][0]=='O') p=p|c;
else if (s[i][0]=='X') p=p^c;
}
return p;
}
bool Check(int p,int pos)
{
bool c=Last(p,pos);
return c;
}
int main()
{
unsigned int sum=0,ans=0;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) scanf("%s%d",&s[i],&a[i]);
for (int i=31;i>=0;i--)
{
if (Check(0,i))
{
ans+=(1<<i);
continue;
}
else if (Check(1,i))
{
int c=sum+(1<<i);
if (c<=m)
{
sum=c;
ans+=(1<<i);
}
}
}
printf("%d\n",ans);
return 0;
}