HDU4701_Game
很有意思,很好的一个题目。
题目的意思是两个人初始状态分别有A和B元,现在有N件可买的商品。两人轮流买,商品必须从左到右买过去,一次可以买若干个。第一个无法买到商品的人输。
一看就知道是博弈题目,但是这并不是什么模型式的博弈题目,其实是转化成递推来做的。
一开始我也不知道到底应该怎么来考虑这个问题,于是就按照博弈的思想用Mex的思路去写这个题目,直到我T了发。
后来在网上看到神牛们写的博客后才发现正确的解法。
其实这个问题应该是这样来考虑的。
首先告诉了你两个人初始的钱数,那么总共的钱数是确定。在买完若干件商品后,一部分的钱数已经花在了买商品上面(先不管是谁买的),另一部分的钱还分别留在两个人的手中。这样如果我们知道当前买完了某件商品后其中一个人的剩余的钱数,那么我们可以根据总钱数不变来推出另一个人手中的钱数。
同时,如果在买某一件商品开始是,ALICE手中只要有x元就有了必胜的策略,那么他手中的钱数如果大于x,显然就也是必胜咯。
有了这两点,我们可以来个递推,解决这个问题。
状态f[i]表示在买第i件商品前,只要先手的人的钱数不少于f[i],那么他就有必胜的策略。
什么意思呢?
我们首先看看,A+B即总钱数,最多能买到多少件商品,显然后面的商品都是没有用的。
然后,对于可买的最后的那件商品n,f[n]=a[n]; 因为根据总钱数,只要他能够买掉最后一件商品,下一个人一定无钱购买后面的商品。
接下来就是从i递推到i-1了。
首先从i-1到i可能有两种情况:
一、第i-1个商品和第i个商品是同一个人购买,这说明要是在购买i-1个商品的时候就有必胜的策略,那么此时他手里的钱数必须不小于a[i-1]+f[i](买完第i-1个商品后,必须至少还剩下f[i]的钱)。
二、第i-1个商品和第i个商品不是同一个人购买,这说明前一个人在购买了i-1个商品后,留下了一个必败态给下一个人去购买第i个商品,这里我们知道对于第i个商品,其必败态就是钱数不足f[i]。这样根据总价值的关系就可以推出这种情况下的f[i-1]了。
综合上面的两种情况,我们知道f[i]就是两种情况中的最小值。
这样逐一递推,到达求出f[1],显然我们只要把f[1]和A比较大小,就可以得出谁胜谁负了。
题目很有意思,以前没做过这种类型的题目。赞一个。
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1000100
#define ll long long
using namespace std; ll n,m,A,B,l,r,mid,tot;
ll a[maxn],f[maxn],sum[maxn]; ll find()
{
l=,r=n;
if (A+B>=sum[n]) return n;
while (l<r)
{
mid=(l+r)>>;
if (sum[mid]>A+B) r=mid;
else l=mid+;
}
return l-;
} int main()
{
while (scanf("%I64d%I64d%I64d",&n,&A,&B)!=EOF)
{
sum[]=;
tot=A+B;
for (ll i=; i<=n; i++) scanf("%I64d",&a[i]),sum[i]=sum[i-]+a[i];
if (A<sum[])
{
printf("BOB\n");
continue;
}
if (A>=sum[n])
{
printf("ALICE\n");
continue;
}
n=find();
f[n]=a[n];
if (tot-sum[n-]-f[n]>=a[n]) f[n]=tot-sum[n-]-a[n]+; for (int i=n-; i>=; i--)
{
f[i]=a[i]+f[i+];
if (tot-sum[i-]-f[i+]+<f[i]) f[i]=tot-sum[i-]-f[i+]+;
} if (f[]>A) printf("BOB\n");
else printf("ALICE\n");
}
return ;
}
HDU4701_Game的更多相关文章
随机推荐
- 20145234黄斐《Java程序设计》实验一—Java开发环境的熟悉(Linux + Eclipse)
实验步骤 由于实验时间比较紧张,这里只有最终结果的截图 (一)命令行下Java程序开发 (二)Eclipse下Java程序开发.调试 (三)练习 实现求正整数1-N之间所有质数的功能,并进行测试 实验 ...
- mysql的启动,停止与重启
启动mysql:方式一:sudo /etc/init.d/mysql start 方式二:sudo start mysql方式三:sudo service mysql start 停止mysql:方式 ...
- 简单的Slony-I设置实例 II
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页 接前面例子, 简单的Slony-I设置实例 这次我 ...
- Block 在 ARC 下的拷贝
前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...
- (转) 前端面试之js相关问题(一)
原帖地址:http://stephenzhao.github.io/2016/08/19/Front-end-Job-Interview-Questions/ 最近我也是经历过面试别人和去面试的人了, ...
- 洛谷P2831 愤怒的小鸟
洛谷P2831 愤怒的小鸟 原题链接 题解 首先简单数学公式送上. \(ax_1^2+bx_1=y_1\) \(ax_2^2+bx_2=y_2\) \(ax_1^2x_2+bx_1x_2=y_1x_2 ...
- 在Centos7下安装与部署.net core
在Centos7下安装与部署.net core 2018年02月28日 19:36:16 阅读数:388 个人安装流程,参照文档 https://www.cnblogs.com/Burt/p/6566 ...
- JS继承方法
1.原型链: 每个构造函数都有一个原型对象,且有一个指针指向该原型对象(prototype),原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(p ...
- 180725-InfluxDB-v1.6.0安装和简单使用小结
InfluxDB安装和简单使用小结 InfluxDB是一个时序性数据库,因为工作需求,安装后使用测试下是否支持大数据下的业务场景 说明: 安装最新版本 v1.6.0 集群版本要收费,单机版本免费 内部 ...
- CSS 实用实例
背景颜色 1. 颜色背景 <style type="text/css">body { font-size: 16px;">h1 { font-size: ...