题目链接:http://codeforces.com/contest/578/problem/B

题目大意:现在有n个数,你可以对其进行k此操作,每次操作可以选择其中的任意一个数对其进行乘以x的操作。
思路:最先想到的办法是贪心,也就是选择数组中最大的那个数对它进行k次乘以x的操作。但是这种方法在有的时候会出现错误,如测试数据的第三组:
2 1 2
12 9
这种情况下有2个数,我能够对其进行1次乘以2的操作,如果以之前贪心的方法,选择12乘以2,那么得到的结果(12*2)|9=25,但是如果选择9乘以2,得到的结果是(9*2)|12=30。
考虑12和9的二进制:
12     = (1100)
9      = (1001)
12*2   =(11000)
9*2    =(10010)
12*2|9 =(11001)
9*2|12 =(11110)
可以看到,12*2因为和9在低位因为1|1的数量太多导致了出现12*2|9的结果小于9*2|12的结果,所以说这种贪心的方法是有不正确的地方的。
正确的方法是选择枚举每一个数a[i],计算a[i]*(x的k次方)与其余n-1个数的or和。
这种方法总能找到最优的答案。因为如果我不是选择一个数让他乘上所有的k个x,而是选择了大于1个数让他们分别乘上若干个x,那么在我最开始介绍的让最大的数乘以k个x的贪心方法肯定比这种方法得到更大的结果,因为这种贪心的方法得到的答案的二进制数的最高位一定比拆开来乘得到的二进制的方法得到更大的结果。
我用l[i]表示a[1]到a[i]的or sum,r[i]表示a[n]到a[i]的or sum,delta表示x的k次方,那么我只要枚举每一个l[i-1]|(a[i]*delta)|r[i]就可以了。
参考代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. #define ll long long
  6. const int maxn = ;
  7. int n, k, x;
  8. ll l[maxn], r[maxn], a[maxn], delta;
  9. int main() {
  10. cin >> n >> k >> x;
  11. for(int i=;i<=n;i++) cin >> a[i];
  12. for(int i=;i<=n;i++) l[i] = l[i-] | a[i];
  13. for(int i=n;i>=;i--) r[i] = r[i+] | a[i];
  14. delta = ; for(int i=;i<k;i++) delta *= x;
  15. ll ans = ;
  16. for(int i=;i<=n;i++) {
  17. ll tmp = l[i-] | (a[i] * delta) | r[i+];
  18. ans = ans > tmp ? ans : tmp;
  19. }
  20. cout << ans << endl;
  21. return ;
  22. }

Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B. "Or" Game的更多相关文章

  1. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C. Weakness and Poorness 三分 dp

    C. Weakness and Poorness Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  2. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B. "Or" Game 线段树贪心

    B. "Or" Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/578 ...

  3. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] E. Weakness and Poorness 三分

    E. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] A. Raising Bacteria【位运算/二进制拆分/细胞繁殖,每天倍增】

    A. Raising Bacteria time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] D 数学+(前缀 后缀 预处理)

    D. "Or" Game time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  6. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] E 三分+连续子序列的和的绝对值的最大值

    E. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  7. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C A Weakness and Poorness (三分)

    显然f(x)是个凹函数,三分即可,计算方案的时候dp一下.eps取大了会挂精度,指定循环次数才是正解. #include<bits/stdc++.h> using namespace st ...

  8. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)

    首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x. 当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可. #include<bit ...

  9. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] A A Problem about Polyline(数学)

    题目中给出的函数具有周期性,总可以移动到第一个周期内,当然,a<b则无解. 假设移动后在上升的那段,则有a-2*x*n=b,注意限制条件x≥b,n是整数,则n≤(a-b)/(2*b).满足条件的 ...

随机推荐

  1. Intellij IDear关闭页面浏览器显示图标

    如在xml页面或html页面,右上角老显示 看着特别不爽,可以如此关闭 第一步 File->setting 第二步

  2. mysql-8.0.11-winx64.zip安装教程

    mysql-8.0.11-winx64.zip安装教程   下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/download ...

  3. SpringBoot配置文件 application.properties详解

    SpringBoot配置文件 application.properties详解   本文转载:https://www.cnblogs.com/louby/p/8565027.html 阅读过程中若发现 ...

  4. 解析CEPH: 存储引擎实现之一 filestore

    Ceph作为一个高可用和强一致性的软件定义存储实现,去使用它非常重要的就是了解其内部的IO路径和存储实现.这篇文章主要介绍在IO路径中最底层的ObjectStore的实现之一FileStore. Ob ...

  5. LeetCode第[66]题(Java):Plus One

    题目:数组加一 难度:Easy 题目内容:   Given a non-empty array of digits representing a non-negative integer, plus ...

  6. Linux:安装git

    1.下载 https://www.kernel.org/pub/software/scm/git/git-2.9.4.tar.gz 2.解压 tar zxvf git-2.9.4.tar.gz cd  ...

  7. MySQL show processlist 执行状态分析

           1.Sleep 通常代表资源未释放,如果是通过连接池,sleep状态应该恒定在一定数量范围内 实战范例:因前端数据输出时(特别是输出到用户终端)未及时关闭数据库连接,导致因网络连接速度产 ...

  8. 八行代码解决八皇后问题(c++)

    说的有点夸装,实际上并不只是巴航代码,加上前面的变量声明之类的一共有40多行的样子吧,好像是在知乎上看到的,现在有时间再把它写下来: 其中用到了一些c++11特性,例如lambda 以及给予范围的 f ...

  9. UICollectionView-网格视图

    1. UICollectionView 网格视图,除了提供与UITableView同样的功能显示一组顺序显示的数据,还支持多列的布局. 2. UICollectionView 使用 > 设置Co ...

  10. [置顶] php检测输入数据是否合法常用的类

    <?php class Fun{ function isEmpty($val) { if (!is_string($val)) return false; //是否是字符串类型 if (empt ...