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判断101-200之间有多少个素数,并输出所有素数。

    代码如下: public static void main(String[] args) { //记录个数 int count = 0; //循环遍历 for(int i = 101;i <= ...

  2. RabbitMQ 多消费者 使用单信道和多信道区别

    RabbitMQ 多个消费者共用一个信道实例 与 每个消费者使用不同的信道实例 区别: 1. 多个消费者共用一个信道实例:这种方式下,多个消费者共享同一个信道实例来进行消息的消费. 优点:这样可以减少 ...

  3. TCP/IP网络体系结构中,各层的作用,以及各层协议的作用。

    1.[TCP/IP]协议中每层的作用 从协议分层模型方面来讲,TCP/IP由四个层次组成:数据链路层(网络接口层).网络层.传输层.应用层 TCP/IP网络体系结构中,各层作用: 1.网络接口层:负责 ...

  4. 【转载】DSP 缓存机制及影响测试

    本文主要以DSP讲解cache原理,但原理与CPU是相通的,故转载,原文地址:https://blog.csdn.net/qq_39376747/article/details/112794096 目 ...

  5. docker :repository docker.io/zookeeper not found: does not exist or no pull access

    分析 略 解决 vi /etc/docker/daemon.json { "registry-mirrors" : [ "http://registry.docker-c ...

  6. 01-jQuery的基本结构

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 王道oj/problem17

    网址:http:oj.lgwenda.com/problem17 思路:指针其实就是存储地址的一个空间,LinkList=LNode* 代码: #define _CRT_SECURE_NO_WARNI ...

  8. JMeter 线程组之Stepping Thread Group插件

    JMeter 线程组之Stepping Thread Group插件 测试环境   apache-jmeter-2.13 插件:https://jmeter-plugins.org/downloads ...

  9. .NET周刊【8月第1期 2023-08-06】

    国内文章 NativeBuferring,一种零分配的数据类型(上篇) https://www.cnblogs.com/artech/p/17586781.html 之前一个项目涉及到针对海量(千万级 ...

  10. Winform跨线程访问UI

    在开发winfrom应用时,经常遇到异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"xxxx"的线程访问它.出 ...