题目大意:

给定一种函数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

代码为:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int ar[],tim[],which[];
  4. int main(){
  5. ios::sync_with_stdio();
  6. cin.tie();cout.tie();
  7. int n,i,j,k;
  8. cin>>n;
  9. memset(tim,,sizeof tim);
  10. for(i=;i<n;i++){
  11. cin>>ar[i];
  12. for(j=,k=;j<;j++){
  13. if(ar[i]&k){
  14. if(!tim[j])
  15. which[j]=i;//记录第一次出现第j位为1的数
  16. tim[j]++;
  17. }
  18. k<<=;
  19. }
  20. }
  21. for(j=;j>=;j--){
  22. if(tim[j]==){//这一位是所有只出现一次的1的最高位
  23. swap(ar[],ar[which[j]]);
  24. break;
  25. }
  26. }
  27. for(i=;i<n;i++)
  28. cout<<ar[i]<<' ';
  29.  
  30. return ;
  31. }

Codeforces 1299A/1300C - Anu Has a Function的更多相关文章

  1. 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 ...

  2. Educational Codeforces Round 13 D. Iterated Linear Function 水题

    D. Iterated Linear Function 题目连接: http://www.codeforces.com/contest/678/problem/D Description Consid ...

  3. Educational Codeforces Round 13 D. Iterated Linear Function (矩阵快速幂)

    题目链接:http://codeforces.com/problemset/problem/678/D 简单的矩阵快速幂模版题 矩阵是这样的: #include <bits/stdc++.h&g ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. Educational Codeforces Round 26 E - Vasya's Function

    数论题还是好恶心啊. 题目大意:给你两个不超过1e12的数 x,y,定义一个f ( x, y ) 如果y==0 返回 0 否则返回1+ f ( x , y - gcd( x , y ) ); 思路:我 ...

  8. Codeforces Round #618 (Div. 2)

    题库链接 https://codeforces.ml/contest/1300 A. Non-zero 一个数组,每次操作可以给某个数加1,让这个数组的积和和不为0的最小操作数 显然如果有0的话,必须 ...

  9. Codeforces题解集 1.0

    记录 Codeforces 2019年12月19日到 2020年2月12日 的部分比赛题 Educational Codeforces Round 82 (Rated for Div. 2) D Fi ...

随机推荐

  1. vs2010编译C++ 静态成员函数的引用

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using names ...

  2. 向量容器vector操作

    1.向量容器vector 1.1 vector说明 进行vector操作前应添加头文件#include<vector>: vector是向量类型,可以容纳许多类型的数据,因此也被称为容器: ...

  3. springmvc线程安全问题

    对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截.struct2为每一个请求都实例化一个action所以不存在线程安全 ...

  4. 自己写个tween

    public Vector3 begin,end;//起始终止坐标 public float BtoE_time;//用时 float timer,lerp;//计时器和进度值 void Update ...

  5. 单调栈应用--将一个数删除n各数字之后的最大\最小值

    E. Playing with numbers time limit per test 2.0 s memory limit per test 64 MB input standard input o ...

  6. UVA - 1513 Movie collection (树状数组)

    题意:有n个影碟,标号为1~n,位置为0~n-1,每次取出一个影碟看完后,将其放在最前面(标号为0处),问每个影碟取出前,其位置之前有多少个影碟. 分析: 1.数组大小开为100000*2,后1000 ...

  7. 云时代架构阅读笔记九——web应用存在的问题及解决办法

    web应用通常存在的10大安全问题 1.SQL注入 拼接的SQL字符串改变了设计者原来的意图,执行了如泄露.改变数据等操作,甚至控制数据库服务器, SQL Injection与Command Inje ...

  8. JavaWeb高级编程(下篇)

    Java标准标签库 JSP标签语法中包含一些简写可以帮助轻松编写JSP.这些简写中第一个就是taglib指令. <%@ taglib prefix="c" uri=" ...

  9. 二十一、SAP中通过内表输出数据库中数据

    一.我们查看一个SCARR的一个数据库 二.数据库内容如下 三.我们写一个关于内表使用的代码,来显示这个数据库内容 四.输出如下

  10. 052-PHP输出多个参数

    <?php $x=5; //初始化两个变量 $y=10; echo $x,$y,"<br />$x+$y=",$x+$y; //输出多个参数 ?>