记录编号 | 438393 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [NOI 2014]起床困难综合症 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.808 s | ||
提交时间 | 2017-08-15 22:54:51 | 内存使用 | 19.39 MiB | ||
#include<bits/stdc++.h>/*每一位是独立的,所以可以一位一位看,看它取什么可以在一系列操作之后得到1,最后将这些结果合并*/ using namespace std; int n,m,a[100005][50],b[50]; int pd(int x,int y){ for(int i=1;i<=n;i++){ if(a[i][0]==1)y&=a[i][x]; if(a[i][0]==2)y|=a[i][x]; if(a[i][0]==3)y^=a[i][x]; } return y; } int main() { freopen("sleep.in","r",stdin); freopen("sleep.out","w",stdout); // freopen("1.txt","r",stdin); scanf("%d%d",&n,&m); b[0]=1; int M=m; for(int i=1;i<=30;i++) b[i]=b[i-1]<<1; for(int i=1;i<=n;i++){ char c[10]; int x,h=0; scanf("%s%d",c,&x); if(c[0]=='A')a[i][0]=1; if(c[0]=='O')a[i][0]=2; if(c[0]=='X')a[i][0]=3; m=max(m,x);//这里要取出最大的值,后面求出它的最高位是什么,而不是m的最高位,因为m不一定是最大得数,比m最高位还要高的位取0时,通过一系列操作可能出现1,所以需要考虑,也就是取最大值的最高位,再高的话全是0无需考虑 while(x){ a[i][++h]=x%2; x/=2; } } int h=0; while(m){ h++; m/=2; } int ans=0; for(int i=h;i>=1;i--){ int tem1=pd(i,1); int tem2=pd(i,0); if(tem2==1){//贪心的思想,不花费就可以得到1那就直接弄,花费能得到1,如果在允许范围内就花费,因为高位的1比地位所有全是1还要大,不然不进行操作 ans+=b[i-1]; } else if(tem1==1&&M-b[i-1]>=0){ ans+=b[i-1]; M-=b[i-1]; } } cout<<ans; return 0; }