贪心 ---- C. Anu Has a Function位运算+贪心证明
题目链接
有一种操作f(x,y)=(x∣y)−yf(x,y)=(x|y)−yf(x,y)=(x∣y)−y,给你一个序列a1,a2,...,an。a1,a2,...,an。a1,a2,...,an。
让你改变一下序列a的顺序,让f(f(...f(f(a1,a2),a3),...,an−1),an)f(f(...f(f(a1,a2),a3),...,an−1),an)f(f(...f(f(a1,a2),a3),...,an−1),an)最大。
我们看这样一个操作他代表着什么?
我们把x,y拆解成二进制,x|y就相当于让两方都有1的一起有1了,然后−y就是让y位置上有1的减去。
举个例子,比如说x=1101,y=0111,那么就相当于说把x的最后一位1和第二位1带走了。
把所有数字拆成二进制,如果一个位置上的1,出现了多次(大于1),那么这个位置上的1肯定留不住。
所以我们就找最高位的出现一次的1,然后把它放到最前面去,之后的数字随便摆放。
可以模拟一下这个样例,9 5 9,把5摆到最前面上是最优解。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int n, a[maxn];int num[40];
int cnt;int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &a[i]);int x = a[i];int tmp = 0;while(x){if(x&1) num[tmp++] += 1;else num[tmp++] += 0;x >>= 1;}cnt = max(cnt, tmp);}int pos = -1;for(int i = cnt-1; i >= 0; i--)if(num[i] == 1){pos = i;break;}if(pos == -1){for(int i = 1; i <= n; i++)printf("%d ", a[i]);return 0;}for(int i = 1; i <= n; i++){if(a[i]>>pos&1){swap(a[i], a[1]);break;}}for(int i = 1; i <= n; i++)printf("%d ", a[i]);return 0;
}
贪心 ---- C. Anu Has a Function位运算+贪心证明相关推荐
- Anu Has a Function——位运算
首先,第一行献给我痛苦的两个小时调试 题意:排序数组,使得f(f(-f(f(a1,a2),a3),-an−1),an)f(f(-f(f(a1,a2),a3),-an−1),an) f(f(-f(f(a ...
- C. Anu Has a Function(位运算思维)
题目 思路:对于两个二进制数f(x,y)=x|y-y 举两个例子 x 11101 y 10100 f(x,y)=01001 x 111111 y 1010 f(x,y)=110101 我们可以发现f( ...
- CH - 0104 起床困难综合症(位运算+贪心)
题目链接:点击查看 题目大意:我们需要构造一个初始值start,范围在[0,m],要求使用这个初始值进行k次操作后得到的答案最大,每次操作分为三个类型: AND x:让当前答案与x进行按位与 OR x ...
- C. Anu Has a Function(思维+位运算+贪心)
https://codeforces.com/contest/1300/problem/C 和昨晚这场的div2的B有异曲同工之妙. 思路:对每一个数位进行二进制位数的考虑. f(x,y)=(x|y) ...
- CodeForces - 1368D AND, OR and square sum(位运算+贪心)
题目链接:点击查看 题目大意:给出 n 个数组成的序列 a ,现在可以进行的操作是,任选两个下标 i 和 j ,满足 i != j ,使得: 设 x = a[ i ] , y = a[ j ] a[ ...
- jzoj4274-终章-剑之魂【位运算,贪心】
正题 大意 有n把剑,每一把剑有一个值aiaia_i,然后两把剑的契合值是ai and ajaiandaja_i\ and \ a_j,求最大契合值. 解题思路 先把每个a转换成二进制 我们可以先从高 ...
- 【NOI2014】起床困难综合症 位运算+贪心
这道题先求出0和-1经过处理后的答案 具体看代码吧 #include<cstdio> #include<cstring> #include<algorithm> u ...
- Anu Has a Function CodeForces - 1300C(二进制位运算)
Anu has created her own function ff: f(x,y)=(x|y)−yf(x,y)=(x|y)−y where || denotes the bitwise OR op ...
- USACO2.1【bfs,排序,贪心,dfs,位运算】
前言 开始刷USACO的题了. 正题 刷前必备技能:OI常识,bfs,dfs,位运算,基础贪心,快速排序. T1:城堡 TheCastleThe CastleTheCastle 评测记录: https ...
最新文章
- 0.数据结构学习笔记大纲
- 第二讲 html5框架+Crosswalk打包app 以及 Angularjs 基础(初步认识了解Angularjs)
- js弹框带传值父窗口给子框_JavaScript实现弹出子窗口并传值给父窗口
- 8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画
- OpenCV isContinuous()连续存储的问题
- logstash filter 处理json数据按原始数据字段数据存储
- JavaSE Collections类 , Iterator迭代器 , 增强for循环
- Delphi2010安装TWordApplication控件
- 模式实例之——中介者实例
- java堆排序递归代码,无原理版,比较好理解
- 2019年华为JAVA面试题系列
- MATLAB控制有效数字
- 搜索量过低百度和谷歌竞价账户分别是怎么处理的
- eap wifi 证书_WIFI用户EAP-TLS认证.pdf
- Terra Gate 安装
- python之pil的使用
- 那年杏花微雨,你说你是DOM
- 圣诞树的雪花飘飘(结尾附源码)
- 利用公交刷卡数据分析北京职住关系和通勤出行
- AutoDL 算力云 服务器租用教程