TopCoder 15903 EllysNim(https://vjudge.net/problem/TopCoder-15903)

\(n\)看似有点东西,实际上就只是一个贪心。。。

设\(i\)表示第\(i\)位,且\(i\)从\(0\)开始计数

那么我们肯定是让\(i\)从高位到低位枚举,若当前位的异或值为\(1\),想办法让它变成\(0\)且不会改变更高位的异或值

首先,若我们想改变第\(i\)位的异或值,那么最优的方法肯定是将一个第\(i\)位为\(0\)的数的后\(i+1\)位加成\(2^i\),选多个肯定不如选一个优,设这个数的后\(i+1\)位为\(a\),那么代价就是\(2^i-a\),这样也不会对更高的位造成影响

但我们的选择多半不只有一个\(a\),假设当前有两个数,它们都是合法的且对应的后\(i+1\)位分别为\(a\)和\(b\)(\(a<b\)),如果我们把\(a\)变成\(2^i\)花费\(2^i-a\)的代价不如将\(b\)变成\(2^i\)花费\(2^i-b\)的代价,至少仅在第\(i\)位看起来是正确的,如果在后面的操作中,我们发现其实第\(i\)位选\(a\)优于\(b\),我们也可以反悔,因为我们可以将\(a\)变成\(b\)花费\(b-a\)的代价,这样总的代价就还是\(2^i-a\),也就是相当于我们将第\(i\)位选的数字从\(b\)变成了\(a\),而且现在还有了一个可以自由支配的\(b\),那么就和我们一开始舍弃的把\(a\)变成\(2^i\),\(b\)留下的方案一样了,这样就是一个反悔贪心

然后具体的,当从\(a\)变成\(b\)的时候,就是在第\(j\)位(\(j<i\)且\(2^j\geq b\),因为\(2^j\geq b\)所以此时只看后\(j+1\)位的话\(a\)和\(b\)都不变)选到\(a\)时,即此时剩下的所有数中,\(a\)是合法且后\(j+1\)位最大的,此时\(a\)变成\(2^j\),就相当于\(a\rightarrow b\rightarrow 2^j\),若不满足这些条件,就说明反悔了答案更劣,所以不反悔

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=105;
int n;
ll b[N],xorr,now,ans=1e18,t;
bool work(int lim){
ll s=(1ll<<lim)-1; int pos=n;
for(int i=0;i<n;++i) if(!(b[i]>>lim&1)&&(b[i]&s)>=(b[pos]&s)) pos=i;
if(pos==n) return false;
now^=b[pos],t+=(1ll<<lim)-(b[pos]&s),b[pos]=1ll<<lim;
return true;
}
class EllysNim{
public:
ll getMin(vector<int> a){
n=a.size();
for(int i=0;i<n;++i) xorr^=a[i];
if(!xorr) return 0;
for(int i=30;~i;--i){
if(xorr>>(i+1)) break;
now=xorr,t=0;
for(int j=0;j<n;++j) b[j]=a[j];
for(int j=i;~j;--j){
if((now>>j&1)||i==j){
if(!work(j)){
t=1e18;
break;
}
if(i==j&&!(now>>j&1)&&!work(j)){
t=1e18;
break;
}
}
}
ans=min(ans,t);
}
return ans;
}
};

TopCoder 15903 EllysNim的更多相关文章

  1. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  2. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  3. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  4. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  5. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  6. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  7. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  8. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  9. Topcoder Arena插件配置和训练指南

    一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...

  10. [Topcoder]AvoidRoads(dp,hash)

    题目连接:https://community.topcoder.com/stat?c=problem_statement&pm=1889&rd=4709 题意:给一张n*m的地图,上面 ...

随机推荐

  1. 每日一题力扣 1262 https://leetcode.cn/problems/greatest-sum-divisible-by-three/

    . 题解 这道题目核心就算是要知道如果x%3=2的话,应该要去拿%3=1的数字,这样子才能满足%3=0 贪心 sum不够%3的时候,就减去余数为1的或者余数为2的 需要注意 两个余数为1会变成余数为2 ...

  2. Linux相关概念及操作

    目录 linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后在此目录下再创建其他的目录. 1./bin 是Binary的缩写,这个目录存放着最经常使 ...

  3. SAP ABAP 使用GENIOS求解线性规划问题的简单例子

    主要内容来自Operations Research & ABAP ,结合我遇到的需求,做了一些修改. 需求:有BOX1和BOX2两种箱子,分别能包装不同数量的A物料和B物料,给出若干数量的A, ...

  4. U8接口开发

    https://console-docs.apipost.cn/preview/b9674fcd9949865b/a5a249fb27736c15 模块 单据 功能说明 库存管理       其他出库 ...

  5. 2021-7-7 VUE笔记2

    if实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <scri ...

  6. HBase Compaction 原理与线上调优实践

    作者:vivo 互联网存储技术团队- Hang Zhengbo 本文对 HBase Compaction 的原理.流程以及限流的策略进行了详细的介绍,列举了几个线上进行调优的案例,最后对 Compac ...

  7. 获取Rtx用户状态方法

    背景:企业OA系统需要与Rtx集成,且高权限身份用户需要获取符合某一条下的所有员工rtx状态... 方案:以此背景,基于rtx sdk做二次开发, 1.后台调用RootObj.QueryUserSta ...

  8. ApiPost: Error:ESOCKETTIMEDOUT

    原因 apipost设置响应时间过短 解决方案

  9. pandas对某列数据进行求和

    求和的方式很简单,如下所示: number_of_declarations = data[4].sum()//中括号中为要求和的列

  10. AcWing 4799. 最远距离题解

    请看: 我们规定,如果一个无向连通图满足去掉其中的任意一条边都会使得该图变得不连通,则称该图为有效无向连通图. 去掉一条边就不连通了,这不就是树吗? (否则如果是图(就是不是树的图)的话,一定有环,拆 ...