记录编号 |
438393 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2014]起床困难综合症 |
最终得分 |
100 |
用户昵称 |
CSU_Turkey |
是否通过 |
通过 |
代码语言 |
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;
}