Codeforces 1299A/1300C - Anu Has a Function
题目大意:
给定一种函数F(x,y)=(x|y)-y,| 即按位或运算
给定一个长度为n的数组a[1],a[2],a[3]...a[n]
可以重新排列数组a,使得 F ( ...... F ( F ( a[1] , a[2] ) , a[3] ) ...... , a[n] ) 最后得到的答案最大
问这样的一个排列(答案不唯一输出任意一个)
解题思路:
首先拿到这种函数,可以去找他的规律
举例两个二进制的数
11111
01010
这两个数先进行取或运算,得到
11111
再减去第二个数,得到
10101
可以发现,这种运算的意义就是
如果在二进制中,后一个数字的第 i 位是1,那么结果中的这一位必定为0
如果在二进制中,后一个数字的第 i 位是0,那么结果中的这一位相等于前一个数字的这一位的值
因为最终答案的计算方式是把数列中每个元素都一层一层套下去
所以可以发现,对于答案的第 i 位而言,如果有大于等于两个数字,或者没有一个数字第 i 位的值为1,那么答案的第 i 位必定为0
理由为:
1、如果没有一个数字第 i 位为1,显而易见第 i 位不可能突然冒出来一个1
2、如果大于等于两个数字第 i 位为1,那么不论怎么这两个数(或这些数)的先后顺序,后一个数字在函数执行完后都必会把这一位变成0
所以,最终答案的二进制中一定会有一位是在所有数字内只出现过一次的(如果答案不为0)
然后还能发现,只要前面套出来的答案中第 i 位已经为0,那么后面的所有数字中不论第 i 位是0还是1,最终答案的第 i 位都是0
所以,要尽量让大的数字靠前
又因为根据二进制而言,10000一定比01111大,即最高位比较高的数字一定大
所以答案就很明显了:
从高位往低位找,如果找到某一位只出现过一次,把这一位对应的那个数字提到数列最前端,其余数字随意排列均可,对答案不会造成影响。
以样例为例子
4 0 11 6
化为二进制即
0100
0000
1011
0110
得到(右数)第一位和第四位均只出现过一次
从最高位往最低位找,明显直接取第四位
出现的第四位为1的数是1011,即11
那么只要11出现在这个数列的头部,剩余三个任意排列,都不会改变答案的值(9)
即排列
11 0 4 6
11 0 6 4
11 4 0 6
11 4 6 0
11 6 0 4
11 6 4 0
六种排列答案相同
另外,如果没有任何一位满足要求,那么整个数组随便排列都行,因为答案必定为0
***题外话:如果此时求的是答案最大值的话,实际上也是这种求法,找到这个需要提到第一个位置的数后,检查这个数字剩余的值为1的位是不是也只出现过一次,把所有是1的只出现过一次的位提出来,就是答案。样例就是这样,第一位和第四位只出现一次的数都在1011,即11这个数上,那么答案就是把第一位和第四位取出,即1001,即9
代码为:
#include<bits/stdc++.h>
using namespace std;
int ar[],tim[],which[];
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
int n,i,j,k;
cin>>n;
memset(tim,,sizeof tim);
for(i=;i<n;i++){
cin>>ar[i];
for(j=,k=;j<;j++){
if(ar[i]&k){
if(!tim[j])
which[j]=i;//记录第一次出现第j位为1的数
tim[j]++;
}
k<<=;
}
}
for(j=;j>=;j--){
if(tim[j]==){//这一位是所有只出现一次的1的最高位
swap(ar[],ar[which[j]]);
break;
}
}
for(i=;i<n;i++)
cout<<ar[i]<<' '; return ;
}
Codeforces 1299A/1300C - Anu Has a Function的更多相关文章
- Codeforces Round #618 (Div. 2)C. Anu Has a Function
Anu has created her own function ff : f(x,y)=(x|y)−y where || denotes the bitwise OR operation. For ...
- Educational Codeforces Round 13 D. Iterated Linear Function 水题
D. Iterated Linear Function 题目连接: http://www.codeforces.com/contest/678/problem/D Description Consid ...
- Educational Codeforces Round 13 D. Iterated Linear Function (矩阵快速幂)
题目链接:http://codeforces.com/problemset/problem/678/D 简单的矩阵快速幂模版题 矩阵是这样的: #include <bits/stdc++.h&g ...
- Codeforces 221 A. Little Elephant and Function
A. Little Elephant and Function time limit per test 2 seconds memory limit per test 256 megabytes in ...
- Educational Codeforces Round 13——D. Iterated Linear Function(矩阵快速幂或普通快速幂水题)
D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes input ...
- Educational Codeforces Round 13 D. Iterated Linear Function 逆元+公式+费马小定理
D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes input s ...
- Educational Codeforces Round 26 E - Vasya's Function
数论题还是好恶心啊. 题目大意:给你两个不超过1e12的数 x,y,定义一个f ( x, y ) 如果y==0 返回 0 否则返回1+ f ( x , y - gcd( x , y ) ); 思路:我 ...
- Codeforces Round #618 (Div. 2)
题库链接 https://codeforces.ml/contest/1300 A. Non-zero 一个数组,每次操作可以给某个数加1,让这个数组的积和和不为0的最小操作数 显然如果有0的话,必须 ...
- Codeforces题解集 1.0
记录 Codeforces 2019年12月19日到 2020年2月12日 的部分比赛题 Educational Codeforces Round 82 (Rated for Div. 2) D Fi ...
随机推荐
- PHP-WebShell-Bypass-WAF
PHP-WebShell-Bypass-WAF PHP WebShell 一句话的结构是:输入和执行,这是经典的PHP 一句话代码: <?php eval($_GET['test']); ?&g ...
- 剑指offer 链表中环的入口位置
题目描述 一个链表中包含环,请找出该链表的环的入口结点. 思路:这题需要知道a = c,然后head和slow每次走一步,相遇的时候就是第一个入口交点, 注意:for循环或者while循环之后,一 ...
- 002.Delphi插件之QPlugins,菜单插件
运行之后的效果如下, 图一 图二 主界面代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...
- apk安装失败的25中原因
名称 Value 描述 INSTALL_FAILED_ALREADY_EXISTS -1 已经安装 INSTALL_FAILED_INVALID_APK -2 APK文件是无效的 INSTALL_FA ...
- vue-i18n多语言文件归类的两种方法
1.按语言类型归类 流行的做法是按照语言对文件进行归类,目录结构类似于: --lang ----en ------test.json --------"abc": "ab ...
- Linux学习《第五章 用户身份与文件权限》
- MongoDB 初始化数据同步
MongoDB初始化数据同步: 副本集中的成员启动之后,就会检查自身的状态,确定是否可以从某个成员那里进行同步.如果不行的话,尝试从其他成员那里进行完整的数据复制. 这个过程就是初始化同步(initi ...
- JavaScript中querySelector()和getElementById()(getXXXByXX)的区别
在日常开发中,使用JavaScript获取元素的时候,最常用的方法就是document.getElementById(getXXXByXX)方法.但是最近发现有很多地方使用的是querySelecto ...
- spring的一些annotation
通过使用spring的注解可以把一些类通过spring容器管理这些类 @controller 控制器(注入服务) @service 服务(注入dao) @repository dao(实现dao访问) ...
- laravel.url
通过php artisan route:list 可以看到当前应用的路由情况, 在前端页面中如果要修改一个实体,需要用到实体.update,涉及的uri为实体/{实体},所用的http方法为put. ...