起床困难综合症 NOI2014
生活随笔
收集整理的這篇文章主要介紹了
起床困难综合症 NOI2014
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這道題簡單題意就是從0到m選一個數,進行n此操作,使得操作完的數最大。
這道題可以很暴力想到O(nm)的做法,枚舉每個0到m的數進行n次操作后的值進行取最大值?
但數據范圍明顯過不去,所以我們要優化一下
首先這些操作都是位運算,是在二進制下對每一位的操作。
因為二進制下每一位都相對獨立,并且每一位只有0和1兩種情況,所以我們從高位到低位枚舉0或1(保證最優解最大),找出能得到最優解的x(0<=x<=m)
對于每一位枚舉的0/1共有4種情況,
(ans為記錄最優解大小,kkk記錄x的大小)
當枚舉為0時,
1.操作后為0時不用管它
2.操作后為1時ans累加
當枚舉為1時
1.操作后為0時不管
2.操作后為1時且kkk加上這個二進制當前位的大小小于m時 kkk和ans累加。
?
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long using namespace std; const int maxn=1000000+101010; inline int read(){int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0';return x*f; }int n,m; struct wzq{int x,y; }a[maxn]; int main(){n=read();m=read();int kk=0,kkk=0;for(int i=1;i<=n;i++){char b[30];scanf("%s%d",b,&a[i].y);if(b[0]=='A')a[i].x=1;if(b[0]=='O')a[i].x=2;if(b[0]=='X')a[i].x=3;}for(int i=30;i>=0;i--){int t=1<<i,k=0;for(int j=1;j<=n;j++){if(a[j].x==1)t=t&a[j].y,k=k&a[j].y;if(a[j].x==2)t=t|a[j].y,k=k|a[j].y;if(a[j].x==3)t=t^a[j].y,k=k^a[j].y;}if(k&(1<<i))kk+=(1<<i);else if(t&(1<<i)){if(kkk+(1<<i)>m)continue;kkk+=(1<<i);kk+=(1<<i);}}printf("%d",kk);return 0; } /* 10 AND 5 OR 6 XOR 7 */?
轉載于:https://www.cnblogs.com/wzq--boke/p/9734778.html
總結
以上是生活随笔為你收集整理的起床困难综合症 NOI2014的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统筹方法--华罗庚 (小学语文)
- 下一篇: 携程飞机票部分 vue/cli+elem