1. 程式人生 > >[NOI2014]起床困難綜合癥

[NOI2014]起床困難綜合癥

log ont temp 題解 比較 main 沒有 位運算 std

技術分享

技術分享

技術分享

技術分享

技術分享

【題解】

並不算很困難的貪心題。位運算畢竟是針對每一位的,從前向後處理,如果某一位1比0更優且可取1就使它為1。比較0和1的結果要單取這一位來看,但是題目中所給的參數並沒有必要全部二進制分解,直接用十進制得到的答案是一樣的。預處理出2的前29次方(幾乎是正好卡到10^9),取二進制位就變得更簡單了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ef[30],n,m,cs[100010],temp,tp,jg,wf;
char a[100010
][5]; int main() { //freopen("t.txt","r",stdin); freopen("sleep.in","r",stdin); freopen("sleep.out","w",stdout); ef[0]=1; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%s%d",a[i],&cs[i]); temp=0; for(int i=1;i<=29;i++) { ef[i]=ef[i-1]<<1
; if(ef[i]<=m) temp=i; } for(int i=temp+1;i>=0;i--) { if(jg+ef[i]>m) continue; tp=ef[i]; for(int j=1;j<=n;j++) { if(a[j][0]==X) tp^=cs[j]; if(a[j][0]==A) tp&=cs[j]; if(a[j][0]==O) tp|=cs[j]; } wf
=0; for(int j=1;j<=n;j++) { if(a[j][0]==X) wf^=cs[j]; if(a[j][0]==A) wf&=cs[j]; if(a[j][0]==O) wf|=cs[j]; } if((wf&ef[i])<(tp&ef[i])) jg+=ef[i]; } for(int i=1;i<=n;i++) { if(a[i][0]==X) jg^=cs[i]; if(a[i][0]==A) jg&=cs[i]; if(a[i][0]==O) jg|=cs[i]; } printf("%d",jg); //while(1); return 0; }

[NOI2014]起床困難綜合癥