【题解】洛谷P2114 [NOI2014]起床困难综合症
生活随笔
收集整理的這篇文章主要介紹了
【题解】洛谷P2114 [NOI2014]起床困难综合症
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前往:我自己搭建的博客
題目
洛谷P2114 [NOI2014]起床困難綜合癥
題解
題意簡化為:在0~m之間找一個(gè)數(shù),使得這個(gè)數(shù)在一系列操作后最大。
由于原數(shù)有大小限制,又要使得到的數(shù)盡量大,為了充分地利用限制,就需要按位從高到低貪心,確定原數(shù)是選0還是選1。如果可以使得到的數(shù)為1,則盡量選,同時(shí)要考慮原數(shù)限制,還要使原數(shù)盡量小。
需要記錄每一位為0或1時(shí),在經(jīng)過操作后會(huì)變成什么。只要用一個(gè)全0數(shù)和一個(gè)全1數(shù)整體操作即可,最后一位位取出來。
代碼
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n,m,a0,a1,t,ans,st; char ch[5]; inline void get_ans() {for(int i=30;i>=1;i--) //st是原數(shù) {int cur=1<<(i-1); //cur只有第i位為1 if(a0&cur) ans+=cur; //優(yōu)先考慮原數(shù)為0 else if(a1&cur&&st+cur<=m) ans+=cur,st+=cur;} //若得到的數(shù)必為0,則原數(shù)默認(rèn)為0 } int main() {scanf("%d%d",&n,&m);a0=0; a1=(1<<30)-1;for(int i=1;i<=n;i++){scanf("%s%d",ch,&t);if(ch[0]=='A') a0&=t,a1&=t;else if(ch[0]=='O') a0|=t,a1|=t;else a0^=t,a1^=t;}get_ans();printf("%d\n",ans);return 0; }總結(jié)
以上是生活随笔為你收集整理的【题解】洛谷P2114 [NOI2014]起床困难综合症的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初学者基础教学篇一——握拍
- 下一篇: postgresql|数据库|插件学习(