《算法竞赛进阶指南》起床困难综合症

2023-10-17 13:40

本文主要是介绍《算法竞赛进阶指南》起床困难综合症,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

输入描述:

第 1 行包含2 个整数,依次为 𝑛, 𝑚 ,表示有 𝑛 扇防御门,初始攻击力为 0 到 𝑚 之间的整数。
接下来 𝑛 行,依次表示每一扇防御门。每行包括一个字符串 op 和一个非负整数 𝑡,两者由一个空格隔开,且 op 在前, 𝑡 在后,op 表示该防御门所对应的操作,𝑡 表示对应的参数。

输出描述:

输出一行一个整数,表示atm 的一次攻击最多使 drd 受到多少伤害。

输入

3 10
AND 5
OR 6
XOR 7

输出

说明

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。

题目大意: 

给定 n,m 以及 n 个数和该数所对应的运算,其中运算有 与、或、异或 三种,问在所有不大于 m 的非负整数中,对给定的 n个数都按该数所对应的运算运算一遍后,能得到得最大的值是多少。

AND 表示按位与,OR 表示按位或,XOR 表示按位异或

解题方法:

注意到 按位与、按位或、按位异或 共有的一个性质:每次运算只有关该位上的数,不影响其它位上的数。
所以我们可以像最大异或对这题一样,从高位到低位来确定数的每一位。如果该位可以填 u,并且填 u 之后答案的该位是 1,那么在该位填 u,否则填 !u
那么如何判断该位能填几呢?

如果该位填 1 后,所得到的数大于 m,那么该位填 !u,否则如果该位填 1 后,所得到的数对 n 个数都运算之后,结果小于等于该位填 0 后得到的结果,那么为了让剩下能填的数更大,该位填 0,否则该位填 1
由于我们只需要得到填出来的数对所有数运算后的结果,而并不需要输出填出来的数,所以在写代码的时候并不需要真正的把数填出来,只需要确定是否能将答案的该位填成 1 即可。

​
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n, m;             // n, m 即题目描述中 n, m
int ans;              // ans 存我们能得到的最大的答案
int t[N];             // t 存输入的 n 个数
short op[N];          // op 存 n 个数对应的操作,1 表示按位或,2 表示按位异或,3 表示与
char str[4];          // str 用于读入操作bool calc(bool x, int j)                         // calc 用于计算 x 经过所有数的第 j 位操作后所得到的结果
{for (int i = 0; i < n; i ++ )                // 从 0 到 n 枚举所有读入的数与其对应操作if (op[i] == 1) x |= t[i] >> j & 1;      // 如果 op[i] 为 1,说明该数所对应的运算为按位或else if (op[i] == 2) x ^= t[i] >> j & 1; // 如果 op[i] 为 2,说明该数所对应的运算为按位异或else    x &= t[i] >> j & 1;              // 如果 op[i] 为 3,说明该数所对应的运算为按位与return x;
}int main()
{scanf("%d %d", &n, &m);for (int i = 0; i < n; i ++ ){scanf("\n%s %d", str, t + i);if (*str == 'O') op[i] = 1;              // 如果该操作为 OR ,那么 op[i] 制为 1else if (*str == 'X') op[i] = 2;         // 如果该操作为 XOR,那么 op[i] 制为 2else    op[i] = 3;                       // 否则该操作为 AND,那么 op[i] 制为 3}for (int i = 29; ~i; i -- )                  // 因为本题中 m 最大是 10 ^ 9,log2(10 ^ 9) = 3log2(10 ^ 3) < 3 * 10 = 30,所以每次 i 从 29 往后枚举就可以了if (1 << i <= m)                         // 如果填 1 后小于等于 m,要看填完后对答案的影响来填{bool x = calc(0, i), y = calc(1, i); // 先分别处理出该位填 0 的结果和该位填 1 的结果if (x >= y) ans|= x << i;            // 如果该位填 1 并不比该位填 0 更优,那么为了让剩下能填的数更大,在该位填 0else ans |= y << i, m -= 1 << i;     // 否则在该位填 1,填完后让 m 减去该位填 1 的结果,这样在后面填数的时候只用考虑是否大于 m 就可以了}else ans |= calc(0, i) << i;             // 否则该位只能填 0,printf("%d\n", ans);return 0;
}

这篇关于《算法竞赛进阶指南》起床困难综合症的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/225766

相关文章

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

如何安装 Ubuntu 24.04 LTS 桌面版或服务器? Ubuntu安装指南

《如何安装Ubuntu24.04LTS桌面版或服务器?Ubuntu安装指南》对于我们程序员来说,有一个好用的操作系统、好的编程环境也是很重要,如何安装Ubuntu24.04LTS桌面... Ubuntu 24.04 LTS,代号 Noble NumBAT,于 2024 年 4 月 25 日正式发布,引入了众

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin