【每日一题】起床困难综合症

起床困难综合症

https://ac.nowcoder.com/acm/problem/17857

Solution

考虑位运算的特点:不进位。

于是可以将答案的每一位分开考虑。从高位到低位枚举每一位所选的 情况。若当前位第 位经过一系列运算后结果可以为 ,那就将答案加上 。由于枚举时由高到低,贪心地使高位为 即可(第 位贡献的答案比第 位到第 位贡献的和还要多)。注意累加值不超过

Code

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1e5+10;
struct node{
    string op;
    int t;
}a[maxn];
int n,m,sum,ans;
int fr(){
    char ch=getchar();
    while(ch>'9'||ch<'0')
        ch=getchar();
    int sum=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')
        sum=(sum<<3)+(sum<<1)+ch-'0';
    return sum;
}
int check(int x,int y){
    int z;
    for(int i=1;i<=n;i++){
        z=a[i].t>>y&1;
        if(a[i].op=="AND")
            x&=z;
        else if(a[i].op=="OR")
            x|=z;
        else
            x^=z;
    }
    return x;
}
int main(){
    n=fr(); m=fr();
    for(int i=1;i<=n;i++){
        cin>>a[i].op;
        a[i].t=fr();
    }
    int x,y;
    for(int i=29;i>=0;i--){
        x=check(1,i);
        y=check(0,i);
        if(x>y&&sum+(1<<i)<=m){
            sum+=(1<<i);
            ans+=(x<<i);
        }
        else
            ans+=(y<<i);
    }
    printf("%d",ans);
    return 0;
}
全部评论

相关推荐

挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
诨号无敌鸭:恭喜佬,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
5 收藏 评论
分享
牛客网
牛客企业服务