首页 > 其他分享 >刷到好题来总结

刷到好题来总结

时间:2024-03-04 23:35:07浏览次数:27  
标签:总结 题目 运算 int 题解 好题 二进制 刷到 bit

P2114 [NOI2014] 起床困难综合症
分析
这题是关于二进制的题目,题目中描述了大量位运算的知识,其实也是在暗示这题与位运算有关了。
思考题目,题目要求我们在给定的值的范围内,进行一定数量的位运算,找到使最后运算得到的值最大的初始值。

既然要运算值最大,那么就要思考在二进制中怎样才能得到尽可能大的值。
二进制运算有一个特点,各个bit位上的值互不干扰,那么我们只要寻找每个bit位的最大值,即经过位运算是否有可能为1,最后将这个尽可能大的二进制数输出即可。
那么如何找到每个位置上尽可能大的值呢,我在洛谷的题解区看到大佬小粉兔的题解,也是让我眼前一新。

既然是要找到每个位置上的最大值,而每个位置又只有2种情况,即0和1,那么我们可以初始化a=0,b=-1,这样就会存在两个二进制数,一个都是0,一个都是1,
然后以a,b为基础进行位运算,设运算结束后为a1,b1,那么我们只要遍历bit位的位数,查看相应bit位上是否能取到1即可。
如果a1该位为1,则结果加上,该位为1,其他位为0所表示的二进制数。
否则的话,检查b1的这一位,,如果为1并且该二进制数不超过题目给出的初始值的范围(a为0,位运算后一定不会超过,所以不用检查),则加上,否则continue。

最后输出结果即可。

因为大佬的代码风格非常不错,还很简洁,我很是喜欢,所以就模仿了其风格,自己码了一遍

#include <iostream>
#include <string>
using namespace std;
typedef long long ll;

int a = 0, b = -1;

int main() {
	int n, m;
	cin >> n >> m;
	string s;
	int t = 0;
	for (int i = 1; i <= n; i++) {
		cin >> s >> t;
		if (s[0] == 'A')
			a &= t, b &= t;
		if (s[0] == 'O')
			a |= t, b |= t;
		if (s[0] == 'X')
			a ^= t, b ^= t;
	}
	int sum = 0;
	for (int i = 30; ~i; i--) {//刚刚才看明白  ~i等价于i>=0,因为i=-1时候,~i=0
		if (a >> i & 1) {      //  >>优先级高于&
			sum += 1 << i;
		} else if (b >> i & 1 && (1 << i) <= m) {
			sum += 1 << i;
			m -= 1 << i;       //下次能从二进制数获取的值的上限减少
		}
	}
	cout << sum << '\n';
	return 0;
}

标签:总结,题目,运算,int,题解,好题,二进制,刷到,bit
From: https://www.cnblogs.com/STArunning/p/18052972

相关文章

  • 今日总结
    今天配置pom.xml<repositories><repository><id>aliyunmaven</id><url>http://maven.aliyun.com/nexus/content/groups/public/</url></repository><repository>......
  • html的总结
    1.2.2渲染引擎(了解)渲染引擎(浏览器内核):浏览器中专门对代码进行解析渲染的部分浏览器出品的公司不同,内在的揎染引也是不同的:浏览器内核不一样,渲染方式就会不同怎么做到统一的打开页面解决就是要有一个相同的web标准1.3.2Web标准的构成Web标准中分成三个构成:构成语言说明......
  • abc343比赛总结
    写在前面A简单,随便取两个值判一下,不过这道题的名字不吉利,叫什么WA啊?B简单,读入的时候判断一下是不是\(1\)就行了。C有点点难,题目不是那么好理解(尤其是英文不好的话)。虽然说\(N\le10^{18}\)但是仔细算一下其实只需要1e6的遍历一遍就够了,毕竟有个三次方。D......
  • 独立开发周记 #55:2 月总结&新 App 上架
    2024,第九周,0226-0303连续两个月没有点外卖,继续保持!2月数据总结下载量(只统计极简时钟)AppStore,下降17.73%GooglePlay,下降17.70%国内安卓市场,下降0.51%收入AppStore,下降3.3%GooglePlay,下降10.24%Admob,增长14.18%国内安卓市场,增长35.19%2月份都在忙安卓端......
  • TortoiseGit使用问题总结
    1、安装和汉化https://blog.csdn.net/qq_42889406/article/details/1087633882、基本使用和克隆https://zhuanlan.zhihu.com/p/3818512073、TortoiseGitPlink提示输入密码https://blog.csdn.net/lala1583165/article/details/108277387......
  • Java List常用方法Stream()简要总结&生成的List去重
    Java中,ArrayList应该是比较常用的一个对象了;那么它的stream()方法大家了解过吗?如果可以熟练使用stream()方法,就可以方便地获取list中元素的某个特定字段、对list中的元素进行筛选、或者把list转成map。参考:https://blog.csdn.net/BHSZZY/article/details/122860048如何获取不重......
  • MCU CY2BL总结
    1.CYT2BLaddressmap•4160KB(4032KB+128KB)ofcode-flash,usedinthesingle-ordual-bankmodebasedontheassociatedbitintheflashcontrolregisterSingle-bankmode-4160KBDual-bankmode-2080KBperbank•128KB(96KB+32KB)ofwork......
  • 代码随想录 第13天 | ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结
    leetcode:239.滑动窗口最大值-力扣(LeetCode)思路:看了挺长时间才反应过来与暴力算法的区别。当遇到比上一个元素大的值时,将上一个元素剔除,小于时加入队列中,每次等于窗口长度时将顶端也就是最大值存起来classSolution{publicint[]maxSlidingWindow(int[]nums,intk)......
  • 总结的Java知识点集合
    这是我读大学时的Java知识点总结,还不全面,后续会逐渐增加完善。知识点集合实例变量实例变量是指在类中声明的变量,其值是针对类的每个实例而独立存储的。每个类的实例都有自己的一组实例变量,它们的值可以在对象创建时初始化,并在整个对象的生命周期中保持不变或者随着对象的状态而......
  • 【2023-2024第一学期】助教工作学期总结
    一、助教工作的具体职责和任务 (包括:你和老师是如何配合的、你和课程其他助教是如何配合的(如果有的话))1、与老师的配合:老师每周会布置课后作业发布在云班课协助老师批改课后作业收集学生对教学的反馈和建议,与教师合作改进教学方法。2、与课程其他助教的配合:共同解决同学......