Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B. "Or" Game
题目链接: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]就可以了。
参考代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define ll long long
const int maxn = ;
int n, k, x;
ll l[maxn], r[maxn], a[maxn], delta;
int main() {
cin >> n >> k >> x;
for(int i=;i<=n;i++) cin >> a[i];
for(int i=;i<=n;i++) l[i] = l[i-] | a[i];
for(int i=n;i>=;i--) r[i] = r[i+] | a[i];
delta = ; for(int i=;i<k;i++) delta *= x;
ll ans = ;
for(int i=;i<=n;i++) {
ll tmp = l[i-] | (a[i] * delta) | r[i+];
ans = ans > tmp ? ans : tmp;
}
cout << ans << endl;
return ;
}
Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B. "Or" Game的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C A Weakness and Poorness (三分)
显然f(x)是个凹函数,三分即可,计算方案的时候dp一下.eps取大了会挂精度,指定循环次数才是正解. #include<bits/stdc++.h> using namespace st ...
- Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)
首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x. 当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可. #include<bit ...
- 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).满足条件的 ...
随机推荐
- php数组元素去空,测试奇数偶数
<?php//返回奇数 function test_odd($var) { return($var & 1); } $a1=array("a","b&quo ...
- Hive-开启动态分区
开启动态分区 --开启动态分区 set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict ...
- JumpGame,JumpGame2
JumpGame:给定一个非负整数数组,开始在第一个位置,每个位置上的数字代表最大可以跳跃的步数,判断能不能跳到最后一个位置. 例如:A=[2,3,1,1,4],在位置0处,可以跳一步到位置1,位置1 ...
- Android View的生命周期
View生命周期相关方法 View是什么?官方源码注释中的定义:这个类是用户接口的基础构件.View表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理. View是所有widget类的基类,Widg ...
- Django进阶Model篇003 - 数据库同步技巧
一.认识一个目录 目录名:migrations 作用:用来存放通过makemigrations命令生成的数据库脚本,不熟悉的情况下,里面生成的脚本不要轻易修改.app目录下必须要有migrations ...
- HYSBZ - 2005 莫比乌斯反演
链接 对于gcd(i,j)的位置来说,对答案的贡献是2*(gcd(i,j)-1)+1,所以答案ans ans=Σ(1<=i<=n)(1<=j<=m)2*(gcd(i,j)-1) ...
- IOS-内存分析
一.内存分析 1.静态分析(Analyze) 不运行程序, 直接检测代码中是否有潜在的内存问题(不一定百分百准确, 仅仅是提供建议) 结合实际情况来分析, 是否真的有内存问题 2.动态分析(Profi ...
- Python基础学习(第5天)
第3课 模块 1.模块(module) Python中一个.py文件就是一个模块,可以调用其它文件中的程序. 例:first.py def laugh(): print '哈哈哈哈哈' second ...
- Qt中内存泄露和退出崩溃的问题
http://blog.csdn.net/wangkuiyun/article/details/7412379
- Drools7.0.0.Final Unsupported major.minor version 52.0异常
异常信息 在使用Drools7.0.0.Final版本进行开发过程中,出现以下异常: java.lang.UnsupportedClassVersionError: org/kie/api/KieSe ...