欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

[codevs3311]起床困难综合症

发布时间:2024/1/18 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [codevs3311]起床困难综合症 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目←

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); }

总结

以上是生活随笔为你收集整理的[codevs3311]起床困难综合症的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。