位运算练习:起床困难综合征(贪心,位运算)(算法竞赛进阶指南学习笔记)

目录

    • 前情提要
    • 起床困难综合征(贪心,位运算)

前情提要

一些基础运算操作用法看看上一篇;

起床困难综合征(贪心,位运算)

题目原文

[P2114 NOI2014] 起床困难综合症 - 洛谷

思路分析

题目很长,意思是让我们在[0,m]之间选一个数x,在经过给定的n次运算后,使最后的结果an尽可能的大;

最简单的思路可是枚举1~m的所有数,最后找到最大的那个数就是所求的答案;但是m的范围去到了109所以会超时不能过所有的点;

因为给出的操作都是位运算所以不难想到这题需要利用位运算去模拟;在这里就用到了位、位运算在二进制数表示下不用进位的特点;所以我们选取的数x时参与运算的各个位置上的数之间都是独立的互不影响的;所以我们就可以去利用贪心的思想;从最高位遍历到在低位;依次考虑每一位上去填几;

用二进制数去模拟只用一次判断每一位上的情况即可;枚举所有m的情况,m取到109相当于229左右,所以在二进制下最多29位;大大缩短了时间;

比如在x的第i位时:

  • 已经填好的更高位构成的数加上1<<i后不超过m并且用每个操作时的数的第i位和x的第i位运算过后不改变第i为上原本的值(操作前后相等);此时我们就可以在an的第i位上填上1;
  • 如果不满足上面的情况,就说明填1可能会超过m的范围或者不如0更优;所以就填0;
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fi first
#define se second
const int N=1e7;
pair <string,int> a[N];
int n,m;
int f(int w,int x){ // 位数,当前位的数for(int i=1;i<=n;i++){ // n组操作int c=a[i].se>>w&1; // 把每个操作对应的数的对应位上的数截出来if(a[i].fi[0]=='A')x&=c;if(a[i].fi[0]=='O')x|=c;if(a[i].fi[0]=='X')x^=c;}return x;
}
signed main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i].fi>>a[i].se; // 先将操作存起来int val=0,an=0; // 当前的值,和答案值for(int i=29;i>=0;i--){ // 枚举所有m的情况,m取到10的9次方,在二进制下最多29位int x0=f(i,0); // 这一位是0时操作后的值int x1=f(i,1); // 这一位是1时操作后的值if(val+(1<<i)<=m&&x0<x1) // 不超m,并且1比0大val+=1<<i,an+=x1<<i; // 就选1作为这一位elsean+=x0<<i; // 反之选0}cout<<an;
} 

当然在这里也可以进行简化;

初始两个变量一个全为0(也就是0)一个全为1(也就是 -1 因为二进制数的第一位表示符号,所以要想全是1那就取-1就好了 )去进行题目给出的操作;

其实就是把上面

int x0=f(i,0); // 这一位是0时操作后的值
int x1=f(i,1); // 这一位是1时操作后的值

这一部分给提前处理了;最后贪心的时候还需要每一位分开看;

最后得到两个结果;贪心时就能用0换1就换,能用1换1也换,不能换不换就好了;

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N=1e7;
signed main(){int n,m;cin>>n>>m;int x=0,y=-1; // 初始两个全1和全0的状态while(n--){string a;cin>>a;int c;cin>>c;if(a[0]=='A')x&=c,y&=c;if(a[0]=='O')x|=c,y|=c;if(a[0]=='X')x^=c,y^=c;}int an=0;for(int i=29;i>=0;i--){ // 枚举每一位上的情况,贪心的思路与上面类似if(x>>i&1)			// 这里是不能填0的情况就变成1an+=1<<i; else if(y>>i&1&&(1<<i)<=m)an+=1<<i,m-=1<<i; // 直接在m上面减就不用在设立val变量}cout<<an<<endl;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PowerBi中REMOVEFILTERS怎么使用?

在 Power BI 的 DAX 中&#xff0c;REMOVEFILTERS() 是一个非常重要的函数&#xff0c;常用于取消某个字段或表的筛选上下文&#xff08;Filter Context&#xff09;&#xff0c;从而让你的计算不受切片器&#xff08;Slicer&#xff09;、筛选器或视觉对象的限制。 ✅ 一、REM…

Vue3 实战:打造多功能旅游攻略选项卡页面

在旅游类应用开发中&#xff0c;为用户提供全面、直观的信息展示界面至关重要。本文将分享如何基于 Vue3 Axios 技术栈&#xff0c;实现一个包含攻略、游记、问答三大板块的旅游攻略选项卡页面&#xff0c;从样式设计到交互逻辑&#xff0c;带你深入了解整个开发过程。 项目背…

JavaScript性能优化实战(1):性能优化基础与性能分析工具

性能优化的重要性与业务价值 在当今竞争激烈的互联网环境中,网站和应用的性能已成为用户体验和业务成功的关键因素。研究表明,页面加载时间每增加1秒,转化率可能下降7%,而53%的用户会在页面加载时间超过3秒后放弃访问。这些数据直接揭示了性能优化对业务的巨大影响: 用户…

Unity 脚本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询&#xff08;spatial queries&#xff09;&#xff0c;例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本&#xff0c;并调整寻路和避免的全局行为。 静态属性&#xff0…

Java 静态内部类面试题与高质量答案合集

本文整理了关于 Java 静态内部类&#xff08;Static Nested Class&#xff09;在面试中的高频问题及标准答案&#xff0c;帮助你理解其底层原理、内存表现以及实际应用。 1. 什么是静态内部类&#xff1f;和普通内部类有什么区别&#xff1f; 答&#xff1a; 静态内部类是定义…

为什么买不到一定阻抗特性曲线的磁环

为什么买不到一定阻抗特性曲线的磁环&#xff1a; 磁环绕不同的圈数&#xff0c;阻抗特性曲线不同&#xff0c;磁环没有类似于磁珠的特定频率和阻抗特性曲线的磁环。 磁环与磁珠的核心区别&#xff1a; 磁珠是一种固定频率阻抗器件&#xff0c;出厂时已通过材料和工艺设计确定…

【MATLAB海洋专题】历史汇总

【MATLAB海洋专题】历史汇总 目录 01&#xff1a;海洋专题进阶教学 02&#xff1a;海洋数据处理 03&#xff1a;海洋数据下载 04&#xff1a;海洋配色 05&#xff1a;海洋专题基础教学 06: 其他基础画图 07&#xff1a;python 画海图专题 08&#xff1a;模式相关文件制作 01…

数据仓库ODS、DWD、DWS、ADS各层介绍

数据仓库Data warehouse&#xff08;可简写为DW或者DWH&#xff09;建设的目的&#xff0c;是为前端查询和分析作为基础&#xff0c;主要应用于OLAP&#xff08;on-line Analytical Processing&#xff09;&#xff0c;支持复杂的分析操作&#xff0c;侧重决策支持&#xff0c;…

动态提示词(小模型)、RAG和提示词系统

动态提示词(小模型)、RAG和提示词系统 目录 动态提示词(小模型)、RAG和提示词系统小模型方案:动态提示词基于规则的动态提示词生成基于模板的动态提示词生成基于小模型的动态提示词生成基于强化学习的动态提示词生成基于元学习的动态提示词生成动态提示词(小模型)RAG(检…

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …

云账号安全事件应急响应指南:应对来自中国IP的异常访问

在当今数字化时代,云服务已成为企业IT基础设施的核心。然而,随之而来的安全挑战也日益突出。本文将详细介绍当发现云账号被来自中国的IP地址异常利用时,应如何快速有效地响应,以确保账户安全并最小化潜在风险。 1. 确认异常活动 首先,我们需要确认是否真的发生了安全事件…

三网通电玩城平台系统结构与源码工程详解(五):客户端热更机制与多端资源分发流程

本篇将聚焦三网通平台在多客户端部署中的资源热更机制设计、跨平台同步策略、版本控制与前端资源发布管理&#xff0c;帮助开发者搭建高效稳定的资源更新系统。 一、资源分发平台架构 为实现安卓端、iOS端、PC端的统一更新分发&#xff0c;平台采用 Node.js Express 构建资源…

spark和hadoop的区别

一、spark概述 二、处理速度 三、 编程模型 四、实时性处理 五、spark内置模块 六、spark的运行模式

AI写代码之GO+Python写个爬虫系统

下面我们我们来利用AI&#xff0c;来用GOPython写个爬虫系统。 帮我写一个Python语言爬取数据写入Mysql的案例&#xff0c;信息如下&#xff1a; 1、Mysql数据库地址是&#xff1a;192.168.1.20 &#xff0c;mysql用户名是&#xff1a;root&#xff0c; Mysql密码是&#xff1…

从单模态到多模态:深度生成模型的演进历程

在人工智能领域&#xff0c;生成模型的发展一直是研究热点。从最早的自编码器到如今的多模态扩散模型&#xff0c;这一技术路线不断突破&#xff0c;为创意内容生成、数据增强和表示学习等领域带来革命性变化。本文将详细介绍几种关键生成模型的技术原理和演进路径&#xff0c;…

【系统架构设计师】嵌入式微处理器

目录 1. 说明2. 微处理器(MPU)3. 微控制器(MCU)4. 信号处理器(DSP)5. 图形处理器(GPU)6. 片上系统(SoC)7. 例题7.1 例题1 1. 说明 1.嵌入式微处理器主要用于处理相关任务。2.由于嵌入式系统通常都在室外使用&#xff0c;可能处于不同环境&#xff0c;因此&#xff0c;选择处理…

Cursor Free VIP 重置进程错误,轻松恢复使用!

快速修复 Cursor Free VIP 重置进程错误&#xff0c;轻松恢复使用&#xff01; 在使用 Cursor Free VIP 的过程中&#xff0c;突然遭遇 “重置进程错误” 是不是让你手忙脚乱&#xff1f;当屏幕弹出 “文件未找到: C:\Users\用户\AppData\Local\Programs\Cursor\resources\app…

dolphinscheduler实现(oracle-hdfs-doris)数据ETL

dolphinscheduler执行 完整脚本(自行替换相关变量)配置文件conf配置文件解析脚本转base64脚本 完整脚本(自行替换相关变量) user_olsh conf/getInfo.sh Oracle user conf/databases.conf password_olsh conf/getInfo.sh Oracle password conf/databases.conf dblink_olsh conf…

小小矩阵设计

在电气设计图中&#xff0c;矩阵设计的接线方法是通过结构化布局实现多灵活链接的技术&#xff0c;常用于信号切换、配电调压或更加复杂的控制场景。 今天聊一种在电气图纸中用到的一种简单矩阵接法&#xff0c;一眼就看明白&#xff0c;很大程度简化了程序控制点和继电器的使用…

【音视频】FFmpeg解封装

解封装 复用器&#xff0c;比如MP4/FLV 解复用器&#xff0c;MP4/FLV 封装格式相关函数 avformat_alloc_context(); 负责申请一个AVFormatContext结构的内存,并进行简单初始化avformat_free_context(); 释放该结构里的所有东西以及该结构本身avformat_close_input();关闭解复…