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. Java 统计大串中小串出现的次数 举例:在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"中java出现了5次

    代码如下: public static void main(String[] args) { //大串 String max = "woaijavawozhenaijavawozhendea ...

  2. 跟着 GPT-4 从0到1学习 Golang 并发机制(三)

    目录 一.前言 二.开聊 2.1 关于 goroutine 泄露问题 2.2 内存模型 2.3 Race Detector 检测数据竞争 三.总结 一.前言 话接上回<跟着 GPT-4 从0到1 ...

  3. 2023年icpc大学生程序设计竞赛-crf

    第一次在除郑轻以外的校外的地方比赛,也是第一次出市比赛,赛程也比较长.20号出发的时候遇到一些意外,不过无伤大雅,第一天热身赛平平无奇,晚上的时候补了一下前年icpc的题,一个多小时做了五题,很是自信 ...

  4. 使用Canal同步mysql数据到es

    一.简介 Canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7 ...

  5. 【题解】Educational Codeforces Round 150(CF1841)

    赛时过了 A-E,然后就开摆了,为什么感觉 C 那么无厘头[发怒][发怒] 排名:25th A.Game with Board 题目描述: Alice 和 Bob 玩游戏,他们有一块黑板.最初,有 \ ...

  6. UG NX实现叉车运输货物功能遇见的问题

    在前一段时间编写模拟叉车运输功能时遇到,货物无法跟随的问题(如下动图) 后面发现是速度太快的原因导致货物没有跟着动,类似于抽桌布的感觉 解决办法有两种:第一种解决办法很简单就是把速度降低到不超过  2 ...

  7. VS Code 有哪些好用的插件呢?【持续更新】

    一.画图工具:vscode-drawio   功能:在 VSCode 中画流程图.数据流图等等.        使用方法:     创建一个后缀名为 .drawio 的文件,然后用 VSCode 打开 ...

  8. 如何在 Windows10 下运行 Tensorflow 的目标检测?

    前言 看过很多博主通过 Object Detection 实现了一些皮卡丘捕捉,二维码检测等诸多特定项的目标检测.而我跟着他们的案例来运行的时候,不是 Tensorflow 版本冲突,就是缺少什么包, ...

  9. 【Unity3D】高斯模糊特效

    1 高斯模糊原理 ​ 边缘检测特效中使用了卷积运算进行了边缘检测,本文实现的高斯模糊特效同样使用了卷积运算,关于卷积核和卷积运算的概念,读者可以参考边缘检测特效. ​ 本文完整资源见→Unity3D高 ...

  10. Amiya 前端UI

    最近在使用一个基于Ant Design 二次封装的组件 Git文档地址 Index - Amiya (gitee.io)