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

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

相关文章

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

SpringBoot整合Apache Flink的详细指南

《SpringBoot整合ApacheFlink的详细指南》这篇文章主要为大家详细介绍了SpringBoot整合ApacheFlink的详细过程,涵盖环境准备,依赖配置,代码实现及运行步骤,感兴趣的... 目录1. 背景与目标2. 环境准备2.1 开发工具2.2 技术版本3. 创建 Spring Boot

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷