链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=994

题意:

有n个海盗劫得了窖藏的m块金子,并准备瓜分这些战利品。按照古老流传下来的分金法则,由最厉害的一名海盗提出一个分金方案,假如有不小于一半的海盗(包括自己)支持这个方案,则按这个方案分,否则把这个海盗扔进海里,重复由下一个厉害的海盗提出方案。

大家都知道,所有海盗都是贪婪的,虽然他们都乐于看到自己的同伴被扔进海里,但是他们还是希望在保命的前提下分的最多的金子,现在已经按海盗的厉害程度进 行了编号,最厉害的海盗为最大号,依次到小,那么第 k 号海盗能分的多少金。(如果他的得金数不能确定,输出0)

输入:(1 ≤ n ≤ 10^4) (1 ≤ m ≤ 10^7)(1 ≤ k ≤ n)

输出:第k个海盗能获得的金币数

参考博文:http://blog.csdn.net/y990041769/article/details/22858781

思路:如果从上往下分析,将会受到小号策略的影响,不妨逆向从小号(只剩1和2)开始往大递推出关联,关联详见博文;

此题的关键必须深刻理解海盗之间的规则:

1.即使没有金币,也必须要保住性命;

如在n > 2*m部分,第一个稳定状态(n-2*m为2^k,同时也是确定分配方案的海盗的id)就是通过给1~2m海盗分配每人分配1个金币收买,剩下的支持票属于就是来自于n-2^(k-1)~n怕死而支持的海盗;

2.在保命的前提下,能获得金币最好;

在n = 2*m+1时,为了保命只能将m个金币全部给奇数好的海盗,但是在n = 2m+2时,就可以利用2m+1这一点,可选的海盗数就为101个,这里就产生了不确定性;

即当第一个稳定状态n >= 2m+2时,任意小于等于n的海盗要不就是>2m原本就不能获得,只是存活下来,结果为0。要不就是因为上一个状态的不确定性,导致不能确定是否会获得金币,结果也是0;

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
#include<map>
#include<queue>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
typedef long long ll;
#define A first
#define B second
#define MK make_pair
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
int T,kase = ,i,j,k,n,m,c; int main()
{
read1(T);
while(T--){
read3(n,m,c);
int ans = -;
if(n <= *m+){
if(c == n) ans = m-(n-)/;
else if((c&) == (&n)) ans = ;
else ans = ;
}else{
n -= *m; //找到第一个稳定状态
while(__builtin_popcount(n) != ) //是否为2的幂次方
n &= (n-);
if(n+*m >= c) ans = ;
}
if(ans == -) puts("Thrown");
else printf("%d\n",ans);
}
return ;
}

NYOJ 994 海盗分金 逆向递推的更多相关文章

  1. 海盗分金问题SQL求解(贪心算法)

    问题 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂鲨 ...

  2. poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 ...

  3. nyoj 46-最少乘法次数 (递推)

    46-最少乘法次数 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:5 submit:18 题目描述: 给你一个非零整数,让你求这个数的n次方,每次相 ...

  4. [递推+dfs]ZOJ 3436. July Number

    题目大意: 将一个数字的相邻两位的差(的绝对值)组成一个新的数字.不断反复.假设最后得到7,就称这个数为July Number,比方9024 – 922 – 70 – 7. 题目要求1e9范围内给定区 ...

  5. NYOJ——301递推求值(矩阵快速幂)

    递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的 ...

  6. 算法设计与分析 - 主定理Master theorem (分治法递推时间复杂度)

    英文原版不上了 直接中文 定义 假设有递推关系式T(n)=aT(n/b)+f(n) 其中n为问题规模 a为递推的子问题数量 n/b为每个子问题的规模(假设每个子问题的规模基本一样) f(n)为递推以外 ...

  7. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

  8. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  9. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

随机推荐

  1. js工作中编程习惯

    在前端编程中总结的习惯不管js还是css 还是后端开发这几点都是必须要做到的做好这几点不管去什么公司都是受到别人的尊重 善用变量,尤其是对DOM结构中的ID以及CLASS 多写注释,自己不熟,前面写后 ...

  2. <Think Complexity> 用字典实现图

    今天在图书馆闲逛的时候偶然看见<Think Complexity>(复杂性思考)这本书,下午看了一会儿觉得很有意思.本书第二章讲的是用Python实现的图,特别写篇博客记录.   首先,图 ...

  3. 编写一个单独的Web Service for Delphi

    早段时间看了一篇好文章,对其整理成以下几步 1新建一个SOAP Server Application,在提示输入接口时输入MyHello,把所有文件保存在一个叫Ser的目录下,其中一个包含TWebMo ...

  4. tlb转dll

    项目中需要用到c++编写的dll文件,但是同事发给我的是一个tlb后缀的文件,此时需要用到vs命令工具,具体操作如下: 开始-->vs2010-->vs命令提示(2010) ,打开后,输入 ...

  5. [转]DataTable用中使用Compute 实现简单的DataTable数据的统计

    本文转自:http://blog.csdn.net/zwxrain/article/details/252285 調用格式: object DataTable.Compute(string expre ...

  6. CF Tavas and Karafs (二分)

    Tavas and Karafs time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. vsftp实现ftps加密传输数据

    FTP明文传输数据,不太安全,ftp+ssl可以实现传输加密=ftps 01.创建FTP用户 user -d /ftp_www  -s /sbin/nologin mvpbang echo " ...

  8. Myeclipse中tomcat所应用的JDK设置

    Preferences------ > MyElipse ---------- >Servers ----------- > Tomcat-------- >Tomcat 6. ...

  9. CSS组件化思考

    为什么组件化? 分层设计,代码复用,减少冗余: 维护方便,弹性好: 如何组件化? 目前代码分成三级: 第一级粒度最细,是基础,主要包含字体配置,颜色配置,UI框架(比如MUI或者pure.css): ...

  10. 在jQuery环境下制作轻巧遮罩层

    遮罩层的好处就是可以屏蔽用户对遮罩层下方元素的操作. 制作原理很简单:1设置遮罩层触发按钮 2设置遮罩层内容 3设置遮罩层背景(重点是捕获内容div的大小位置)4设置点击触发按钮遮罩层背景内容同时显示 ...