当前位置: 首页 > news >正文

一个关于按位或的故事~~(QDU-码农必修)

今天本是集训队集体刷cf之日,可本人的电脑于进行中途中,断网而终。。更是让本人无奈的是:手机打不开vj。于是好烦的来到qduoj,本市找了到dp的题想做,却它丫的找不到思路,然后更烦了,心累。。

于是就看到这题:码农必修,一个考察二进制或者按位或的题目。


先上题目

码农必修

发布时间: 2016年5月2日 21:03   最后更新: 2016年5月2日 21:05   时间限制: 1000ms   内存限制: 128M

给你 x, k, 求满足 x + y= x | y 这个公式的第 k 小的正整数y。

哦对,“|”表示的是二进制里面的按位或操作

输入文件中包含多组数据,每组数据为两个正整数 x , k。 
满足(0 < x , k ≤ 2,000,000,000)。

输出一个数y

  复制
5 1
2
   
1


这题想了一老会才有的思路,可最后回到宿舍交的时候WA好多次,为什么呢??因为题目是多组数据。

思路:如果使 x | y = x + y, 很容易知道,只有y的二进制形式1所在的位置在x的二进制0所在的位置。

例: 5: 101,值y若能使5与其按位或与相加相等,则有 010, 1000, 1010;

所以所以很容易会想到求得数便是在5的二进制的0所在位置添加若干个1的过程。

所以,下面便是找填1的规律,首先先来一个白板 :0 0 0 0

a b c d

现在在d的位置及其之后的位置换1,只有1种方法 0 0 0 1

在c的位置及其之后的位置换1,有3种方法 0 0 0 1, 0 0 1 0, 0 0 1 1;

在b的位置及其之后的位置换1,有7种方法 0 0 0 1 ... 0 1 1 1;

此时规律显而易见了。


那么如何应用此规律呢,题目要求第k小的满足要求的数,那么就把k换成二进制形式,例如k: 10011, 要求第k小的数,所以前10000的数,就是在前4个零不断添加若干1,共2^4-1个,然后加上10000共2^4个,所以在可换1的位置的第五个位置换成1,便代表前2^4小的满足要求的数(这儿最好自己写写+思考便能理会),然后用k-2^4,此时范围缩小至00011,不断如此缩小,当k缩至0时,答案便已经出来了。


代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define LL long long
using namespace std;
int jk[64] = {0};
int main(){
	LL i, x, k, p, kp, l, index, ans, base;
	while(~scanf("%lld %lld", &x, &k)){
		memset(jk, 0, sizeof jk);
		p = x, l = 1;
		while(p){
			jk[l++] = p%2;	//把原数换成二进制形式放入数组,方便之后查询可换成1的0的位置
			p >>= 1;
		}
		while(k){
			p = k, kp = 0, index = 0;
			while(p){
				++kp;		//计算此时的k的二进制位数
				p >>= 1;
			}
			for(i = 1;1; ++i){
				if(jk[i]==0) ++index;
				if(index == kp) break;	//找到第kp个0的位置
			}
			jk[i] = -1;				//将之换成-1方便后面求ans
			k -= pow(2, kp-1);
		}
		ans = 0, base = 1;
		for(i = 1; i <= 64; ++i){	//其实用不到64位的,但也不知道具体到哪,用64以防意外
			if(jk[i] == -1)
				ans += base;		//当遇到自己放1的位置不断将二进制换成十进制数
			base <<= 1;
		}
		printf("%lld\n", ans);
	}
	return 0;
}


此题是一道思维题,加深我们对二进制和位运算的理解,继续加油~

相关文章:

  • ConcurrentHashMap 解读(一)
  • Today一只菜鸡的PAT甲级测试(PAT1124, PAT1125, PAT1126, PAT1127)
  • 快速排序--自行实现+qsort+sort
  • 归并排序--二路归并
  • quartz定时任务时间设置描
  • ctype.h头文件中的tolower和toupper以及cctype其他函数的应用
  • mbr损坏以及grub.conf的配置文件丢失或出错的方法
  • 单链表的基本操作
  • 抽象类与接口的区别
  • 不常用的模拟链表
  • Floyed-Warshall-求最短路
  • Server should be SSL-aware but has no certificate
  • Dijkstra求最短路(邻接表存储,前向星存储,堆优化)
  • linux虚拟机中和主机三种网络连接方式的区别
  • Bellman-Ford算法(队列优化)
  • [PHP内核探索]PHP中的哈希表
  • 2017届校招提前批面试回顾
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  •  D - 粉碎叛乱F - 其他起义
  • k8s如何管理Pod
  • Laravel Telescope:优雅的应用调试工具
  • React-生命周期杂记
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Spring Cloud Feign的两种使用姿势
  • Zepto.js源码学习之二
  • 构造函数(constructor)与原型链(prototype)关系
  • 力扣(LeetCode)965
  • 聊聊flink的TableFactory
  • 前端性能优化--懒加载和预加载
  • 实习面试笔记
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 手写一个CommonJS打包工具(一)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​香农与信息论三大定律
  • ​业务双活的数据切换思路设计(下)
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (06)Hive——正则表达式
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)构建dubbo分布式平台-平台功能导图
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)ABI是什么
  • (转)VC++中ondraw在什么时候调用的
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • . NET自动找可写目录
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记