洛谷P2114 起床困难综合症【位运算】【贪心】
2024-09-05 04:04:16
题目:https://www.luogu.org/problemnew/show/P2114
题意:有n个操作,每个可以是与、或、异或 一个数。
初始值是0~m之间的一个数,问经过n个运算之后,可以得到的最大值是多少。
思路:
这个数的某一位不是0就是1,所以我们可以用一个全为1的数和一个全为0的数做n次操作。然后判断这个数的每个位应该是0还是1就行了。
从高位到低位开始贪心。如果0和1都可以得到1的话,就选0,因为这样数比较小之后贪心的选择比较多。
如果只有1可以得到1的话,看看选1的时候这个数会不会超过m了。不超过答案的这一位就可以是1.
//#include<bits/stdc++>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#include<queue>
#include<map>
#include<stack>
#include<set> //#define LL __int128
#define ull unsigned long long
#define inf 0x7f7f7f7f typedef long long LL;
using namespace std; int n, m; int main()
{
scanf("%d%d", &n, &m);
int allone = 0x7fffffff, allzero = ;
for(int i = ; i < n; i++){
char op[];
int t;
getchar();
scanf("%s %d", op, &t);
if(strcmp(op, "AND") == ){
allone &= t;
allzero &= t;
}
else if(strcmp(op, "OR") == ){
allone |= t;
allzero |= t;
}
else{
allone ^= t;
allzero ^= t;
}
}
int ans = , t = ;
for(int i = ; i >= ; i--){
if(allzero & ( << i)){
ans |= ( << i);
}
else if(allone & ( << i) && m >= (t | ( << i))){
ans |= ( << i);
t |= ( << i);
}
}
printf("%d\n", ans);
return ;
}
最新文章
- Windows Azure 虚拟机的IP地址操作
- jsoup的基本写法
- python开发规则
- linux 配置 wlan 连接
- 数据库的事务、ACID及隔离级别
- Unity支持的跨平台
- Unity历史
- 部署springboot工程到linux上及遇到的坑
- Mapreduce的api编程
- 公钥与私钥的理解,以及https的应用原理
- .gitignore 失效问题解决
- gdb 调试及优化
- 自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点
- TSQL--TOP选项
- vue 表单 验证 async-validator
- HDU 6183 Color it 线段树
- 基于minikube的kubernetes集群部署及Vitess最佳实践
- 多线程设计模式(三):Master-Worker模式
- Jquery获取EasyUI时间控件的值
- Luogu 3350 [ZJOI2016]旅行者
热门文章
- [转帖]Linux中awk工具的使用
- 基于requests模块的代理
- Windows10下安装numpy
- S03_CH11_基于TCP的QSPI Flash bin文件网络烧写
- qt聊天室bug-- error: no matching function for call to &#39;Ui::Widget::setupUi(Widget*)&#39; ui->;setupUi(this); ^
- Snort Inline IPS Mode
- restTemplate源码解析(三)创建ClientHttpRequest请求对象
- K2 BPM_【解决方案】从流程梳理到落地,K2为企业打造流程管理闭环_全业务流程管理专家
- Go 函数编程
- 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧