wwq:这题你居然没一眼切?!
嗯……二进制枚举……
判断不超过m的二进制数的每一位是1更优还是0更优
显然同时满足我们要放0
为了便于判断大小,从高位到低位枚举
复杂度 2*n*log(m)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const LL MAXN = 100000 + 50;
LL n,m;
struct zt
{
LL ch,num;
}ope[MAXN];
string x;
LL len;
LL ans;
LL check(LL loc,LL v)
{
if(v)v <<= loc;
for(LL i = 1;i <= n;i ++)
{
if(ope[i].ch == 1)
{
if((ope[i].num & v) == 0)
v = 0;
}
else if(ope[i].ch == 2)
{
if(ope[i].num & (1 << loc))
v = (1 << loc);
}
else if(ope[i].ch == 3)
{
if(ope[i].num & (1 << loc))
if(v)v = 0;
else v = (1 << loc);
}
}
return v;
}
LL now,maxn;
int main()
{
scanf("%lld%lld",&n,&m);
for(LL i = 1;i <= n;i ++)
{
cin >> x;
if(x == "AND"){
ope[i].ch = 1;
}
else if(x == "OR"){
ope[i].ch = 2;
}
else if(x == "XOR"){
ope[i].ch = 3;
}
scanf("%d",&ope[i].num);
maxn = max(maxn,ope[i].num);
}
len = log2(maxn);
for(LL i = len;i >= 0;i --)
{
LL tmp1 = check(i,1);
LL tmp2 = check(i,0);
if(now + (1 << i) > m || tmp2 >= tmp1)
{
ans += tmp2;
}
else if(tmp1 > tmp2)
{
ans += tmp1;
now += (1 << i);
}
}
printf("%lld",ans);
}

本文介绍了一种使用二进制枚举进行优化选择的算法,并通过具体实例讲解了如何实现这一算法。该算法主要应用于求解最优值问题,在不超过特定约束条件下找到最佳方案。
178

被折叠的 条评论
为什么被折叠?



