BZOJ 3668: [Noi2014]起床困难综合症( 贪心 )
之前以為xor,or,and滿足結合律...然后連樣例都過不了
早上上體育課的時候突然想出來了...直接處理每一位是1,0的最后結果, 然后從高位到低位貪心就可以了...?
滾去吃飯了..?
-----------------------------------------------------------------------
#include<bits/stdc++.h>using namespace std;#define b(i) (1 << (i))const int maxn = 100009;const int L = 30;char opt[maxn];int x[maxn], N, M, ans[50][2];void init() {scanf("%d%d", &N, &M);char s[10];for(int i = 0; i < N; i++) {scanf("%s", s);scanf("%d", x + i);opt[i] = s[0];}}void work() {for(int i = 0; i < L; i++)?for(int j = 0; j < 2; j++) {int t = j; ? ?for(int k = 0; k < N; k++) switch(opt[k]) {case 'A' : t &= (b(i) | x[k]) == x[k]; break;case 'O' : t |= (b(i) | x[k]) == x[k]; break;case 'X' : t ^= (b(i) | x[k]) == x[k]; break;default ?: break; ? ?} ? ?ans[i][j] = t;}int ANS = 0, c = 0;for(int i = L; i--; )if(ans[i][0]) ANS |= b(i);else if(ans[i][1] && (b(i) | c) <= M) ? ?c |= b(i), ANS |= b(i);printf("%d\n", ANS);}int main() {init();work();return 0;}-----------------------------------------------------------------------
?
?
3668: [Noi2014]起床困難綜合癥
Time Limit:?10 Sec??Memory Limit:?512 MBSubmit:?1054??Solved:?596
[Submit][Status][Discuss]
Description
?
21 世紀,許多人得了一種奇怪的病:起床困難綜合癥,其臨床表現為:起床難,起床后精神不佳。作為一名青春陽光好少年,atm 一直堅持與起床困難綜合癥作斗爭。通過研究相關文獻,他找到了該病的發病原因:在深邃的太平洋海底中,出現了一條名為 drd 的巨龍,它掌握著睡眠之精髓,能隨意延長大家的睡眠時間。正是由于 drd 的活動,起床困難綜合癥愈演愈烈,以驚人的速度在世界上傳播。為了徹底消滅這種病,atm 決定前往海底,消滅這條惡龍。歷經千辛萬苦,atm 終于來到了 drd 所在的地方,準備與其展開艱苦卓絕的戰斗。drd 有著十分特殊的技能,他的防御戰線能夠使用一定的運算來改變他受到的傷害。具體說來,drd 的防御戰線由?n扇防御門組成。每扇防御門包括一個運算op和一個參數t,其中運算一定是OR,XOR,AND中的一種,參數則一定為非負整數。如果還未通過防御門時攻擊力為x,則其通過這扇防御門后攻擊力將變為x op t。最終drd 受到的傷害為對方初始攻擊力x依次經過所有n扇防御門后轉變得到的攻擊力。由于atm水平有限,他的初始攻擊力只能為0到m之間的一個整數(即他的初始攻擊力只能在0,1,...,m中任選,但在通過防御門之后的攻擊力不受?m的限制)。為了節省體力,他希望通過選擇合適的初始攻擊力使得他的攻擊能讓 drd 受到最大的傷害,請你幫他計算一下,他的一次攻擊最多能使 drd 受到多少傷害。Input
第1行包含2個整數,依次為n,m,表示drd有n扇防御門,atm的初始攻擊力為0到m之間的整數。接下來n行,依次表示每一扇防御門。每行包括一個字符串op和一個非負整數t,兩者由一個空格隔開,且op在前,t在后,op表示該防御門所對應的操作, t表示對應的參數。
Output
一行一個整數,表示atm的一次攻擊最多使 drd 受到多少傷害。
Sample Input
3 10AND 5
OR 6
XOR 7
Sample Output
1HINT
【樣例說明1】
atm可以選擇的初始攻擊力為0,1,...,10。
假設初始攻擊力為4,最終攻擊力經過了如下計算
4 AND 5 = 4
4 OR 6 = 6
6 XOR 7 = 1
類似的,我們可以計算出初始攻擊力為1,3,5,7,9時最終攻擊力為0,初始攻擊力為0,2,4,6,8,10時最終攻擊力為1,因此atm的一次攻擊最多使 drd 受到的傷害值為1。
0<=m<=10^9
0<=t<=10^9 ?
一定為OR,XOR,AND 中的一種
【運算解釋】
在本題中,選手需要先將數字變換為二進制后再進行計算。如果操作的兩個數二進制長度不同,則在前補0至相同長度。
????? OR為按位或運算,處理兩個長度相同的二進制數,兩個相應的二進制位中只要有一個為1,則該位的結果值為1,否則為0。XOR為按位異或運算,對等長二進制模式或二進制數的每一位執行邏輯異或操作。如果兩個相應的二進制位不同(相異),則該位的結果值為1,否則該位為0。?AND?為按位與運算,處理兩個長度相同的二進制數,兩個相應的二進制位都為1,該位的結果值才為1,否則為0。
????? 例如,我們將十進制數5與十進制數3分別進行OR,XOR?與?AND?運算,可以得到如下結果:
????????????? 0101?(十進制?5)?????????? 0101?(十進制?5)?????????? 0101?(十進制?5)
??? ? ?? OR?0011?(十進制?3)????XOR?0011?(十進制?3)????AND?0011?(十進制?3)
???????? ? =?0111?(十進制?7)???? ? =?0110?(十進制?6)??????? =?0001?(十進制?1)
Source
?
轉載于:https://www.cnblogs.com/JSZX11556/p/4783089.html
總結
以上是生活随笔為你收集整理的BZOJ 3668: [Noi2014]起床困难综合症( 贪心 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NDK开发之日志打印
- 下一篇: Android 界面滑动实现---Scr