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).满足条件的 ...
随机推荐
- 互联网开放平台API安全设计
互联网开放平台设计1.需求:现在A公司与B公司进行合作,B公司需要调用A公司开放的外网接口获取数据,如何保证外网开放接口的安全性.2.常用解决办法:2.1 使用加签名方式,防止篡改数据2.2 使用Ht ...
- 【bzoj3170】[Tjoi2013]松鼠聚会(数学题)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3170 这道题要在n个点中求一个点使其他点到该点的切比雪夫距离最小. 有个结论:$ (x ...
- LeetCode——Insertion Sort List
LeetCode--Insertion Sort List Question Sort a linked list using insertion sort. Solution 我的解法,假设第一个节 ...
- dpdk对虚拟化的支持调研
目录: 虚拟化 dpdk的实现研究 virtio vhost SR-IOV 热迁移相关 研究拓展 本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果,内容梳理如下. 虚拟化 虚拟化,抽象来说,就 ...
- angular-messages.js信息验证的使用
ngMessages(1.3+) 众所周知,表单和验证是Angular中复杂的组件之一.上面的例子不是特别好,不简洁.在Angular 1.3发布前,表单验证必须以这种方式编写.然而在发布的Angul ...
- 设置Qt程序在Windows开机后自动运行
(转自:http://blog.csdn.net/weiren2006/article/details/7443362) 主要原理是修改Windows的注册表来实现的,Qt的QSettings提供了访 ...
- Hosts文件路径及修改方法
(转自:http://www.techolics.com/softdev/20111029_100.html) 什么是Hosts文件? 根据百度百科的定义,Hosts文件是一个系统文件,这是一个本地的 ...
- [eShopOnContainers 学习系列] - Index - 开篇索引
[资料] 学习资料来源于 eShopOnContainers wiki 以及 微软官方微服务架构指南 [eShopOnContainers 学习系列] - 00 - 开发环境需求 [eShopOnCo ...
- LeetCode OJ:Set Matrix Zeroes(设置矩阵0元素)
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 这题要注意的 ...
- request.setAttribute("username", username);//一定要保存,OGNL才能获取${username}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...