【NOI2014】起床困难综合症 贪心

从高到低按位贪心,讨论一下初始0或1,分别暴力算出结果是什么

如果一开始0就能得1当然直接ans垒起来

如果1能得1而且当前m够用,那也垒起来,同时m减掉

否则gg

2min的代码

 1 #include <bits/stdc++.h>
 2 #define miaom(x,y) ((x & (1<<y))>>y)
 3 using namespace std;
 4 int n,m,p[200001],a[60],in[60];
 5 char opt[200001];
 6 char getch()
 7 {
 8     char ch;
 9     for(ch=getchar();!isalpha(ch);ch=getchar());
10     return ch;
11 }
12 int main()
13 {
14     scanf("%d%d",&n,&m);
15     for(int i=1;i<=n;i++)
16     {
17         opt[i]=getch();
18         getch();if(opt[i]!='O')getch();
19         scanf("%d",&p[i]);
20     }
21     int ans=0;
22     for(int i=30;i>=0;i--)
23     {
24         bool a=0,b=1;
25         for(int j=1;j<=n;j++)
26         if(opt[j]=='A')
27             a&=miaom(p[j],i),
28             b&=miaom(p[j],i);
29         else
30         if(opt[j]=='O')
31             a|=miaom(p[j],i),
32             b|=miaom(p[j],i);
33         else
34         if(opt[j]=='X')
35             a^=miaom(p[j],i),
36             b^=miaom(p[j],i);
37         if(a) ans+=1<<i;
38         else
39         if(b && m>=1<<i) m-=1<<i,ans+=1<<i;
40     }
41     printf("%d\n",ans);
42     return 0;
43 }

 

posted @ 2017-05-19 18:45  汪立超  阅读(398)  评论(0编辑  收藏