博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#hihocoder 1509(异或排序)
阅读量:7052 次
发布时间:2019-06-28

本文共 1157 字,大约阅读时间需要 3 分钟。

题目来源:

描述:

给定一个长度为 n 的非负整数序列 a[1..n]

你需要求有多少个非负整数 S 满足以下两个条件:
(1).0 ≤ S < 2^60
(2).对于所有 1 ≤ i < n ,有 (a[i] xor S) ≤ (a[i+1] xor S)
输入
第一行一个正整数 n
第二行 n 个非负整数表示序列 a[1..n]
1 ≤ n ≤ 50
0 ≤ a[i] < 2^60

输出

一个非负正数,表示答案
样例输入
3
1 2 3
样例输出

解题思路

对于每一个a[i]与a[i+1],如果前者大于后者,那么从高位开始,一定有一位是a[i]的为1,a[i+1]的为0,这种情况的话如果要让a[i]^s

代码

#include
using namespace std;#define ll long longll a[100];int b1[100], b2[100];bool vis[100];void stay(ll a, ll b)//看哪些位数是一种{ for (int i = 1; i <= 60; i++) { b1[i] = a % 2; a /= 2; } for (int i = 1; i <= 60; i++) { b2[i] = b % 2; b /= 2; } int ret=0; for (int i = 60; i >= 1; i--) { if (b1[i] == b2[i]) continue; ret = i; break; } vis[ret] = 1;}int main(){ int n; cin >> n; for (int i = 1; i <= n; i++)cin >> a[i]; for (int i = 1; i <= n - 1; i++)stay(a[i], a[i + 1]); ll ans = 0; for (int i = 1; i <= 60; i++) { if (vis[i]) continue; ans++; } ans = (ll)1 << ans; cout << ans << endl; return 0;}

总结

看到数据量大的题的时候,就要考虑一下是不是有什么规律了,然后看到关于异或,或者其它的时候,尽量往二进制方向想。

转载于:https://www.cnblogs.com/IAMjm/p/9385686.html

你可能感兴趣的文章
静态网页怎样实现动态交互?-JavaScript
查看>>
JAVA IO操作:数据操作流:DataOutputStream和DataInputStream
查看>>
[Angular HTML] Overwrite input value, String.fromCharCode & input.selectionStart
查看>>
海思hi3716c机顶盒接usb摄像头和usb无线耳机时,无线耳机有时没有声音
查看>>
word2vec原理(二) 基于Hierarchical Softmax的模型
查看>>
C++中的RAII机制
查看>>
monaco editor + vue的配置
查看>>
Jenkins
查看>>
P1151 子数整数
查看>>
ext4文件系统制作 - make_ext4fs 参数介绍【转】
查看>>
spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置...
查看>>
C++ STL vector(向量容器)的使用(附完整程序代码)
查看>>
Android SDK和NDK
查看>>
动态代理proxy与CGLib的区别
查看>>
040医疗项目-模块四:采购单模块—采购单创建好之后跳转到采购单修改页面(editcgd.action)...
查看>>
Android 控件的显示隐藏上下左右移动动画
查看>>
【资料下载区】【GK101固件】更新日期2017/1/11
查看>>
windows后门
查看>>
网桥原理及使用
查看>>
PHP的两个科学计数法转换为字符串的方法
查看>>