BZOJ 5046 分糖果游戏
网页崩溃了 心态也崩溃了 MD劳资写了那么多
题意:
有a,b两个人分糖,每个人都有一个能量值。
每个人每一轮可以选择进行两种操作:
1.取走最左边的糖果,补充相应的能量值并获取相应的美味度。
2.跳过这一轮,能量值-1.
问在每个人都采取最优决策的情况下,每个人能获得最多的美味度是多少?
类似于两个人博弈的问题 第一步想到的应该是f[i]=min(max(x)) 大概长这样的方程 但是我们发现做不下去
于是我们发现这个题非常神仙 令$f[i][j]$表示取完i~n的所有糖果先手拿到美味度至少为j的先后手能量值之差最小是多少
由于让来让去显然只看能量差的正负 那么我们可以通过维护这个玩意达到目的
显然这个玩意是非严格单调增的
接下来我们考虑两种操作
1.取走糖果 也就是先手达到了j+v[i]的美味度 所以后手达到的美味度一定不能达到suf[i]-j+1 并且他也不能达到这么大的能量差
显然我们可以得到状态转移方程 $f[i][j]=-(f[i+1][suf[i]-j+1]-1)+r[i]$
2.让 也就是说后手一定取走了这颗糖果 于是先后手顺序其实是没有变化的 这时候我们要先保证能量差>=1才能让出去
也就是(A-1-(B+r[i]))(A是先手 B是后手)要取得j的美味度于是得到转移$f[i][j]=max(1,f[i+1][j]+r[i]+1)$
(是不是感觉第二种转移挺反人类的 我也这么觉得)
于是这道题愉快的做完了 这个思路还是可以借鉴一下 但是真的好神仙啊qaq
//Love and Freedom.
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define ll long long
#define inf 2002122520021225ll
#define N 151
#define M 22501
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
ll f[N][N]; int suf[N],n,A,B,r[N],v[N];
int main()
{
n=read(),A=read(),B=read();
for(int i=;i<=n;i++) r[i]=read(),suf[i]=v[i]=read();
for(int i=n-;i;i--) suf[i]+=suf[i+];
for(int i=;i<=v[n];i++) f[n][i]=-inf;
for(int i=v[n]+;i<=suf[];i++) f[n][i]=inf;
for(int i=n-;i;i--) for(int j=;j<=suf[i];j++)
{
if(v[i]>=j) f[i][j]=-inf;
else f[i][j]=-f[i+][suf[i]-j+]+-r[i];
ll tmp=max(1ll,f[i+][j]+r[i]+);
if(j<=suf[i+]) f[i][j]=min(f[i][j],tmp);
}
int fin=;
for(int i=;i<=suf[] &&(ll)A-B>=f[][i];i++) fin=i;
printf("%d %d\n",fin,suf[]-fin);
return ;
}
BZOJ 5046 分糖果游戏的更多相关文章
- [BZOJ5046]分糖果游戏
题目大意: 有a,b两个人分糖,每个人都有一个能量值. 每个人每一轮可以选择进行两种操作: 1.取走最左边的糖果,补充相应的能量值并获取相应的美味度. 2.跳过这一轮,能量值-1. 问在每个人都采取最 ...
- soj#547 bzoj5046 分糖果游戏
分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long ; ][],s[],p[],v[]; si ...
- CSDN 分糖果算法的思路和求助
昨天晚上 在csdn上做了一道分糖果的题目,我自个测的是没有问题,但是提交答案后,老失败,提示 你的程序正常运行并输出了结果,但是答案错误你的程序输出结果与测试数据中的输出结果不符 我先把自个思路说一 ...
- C语言 · 分糖果
历届试题 分糖果 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一 ...
- 蓝桥杯 历届试题 PREV-32 分糖果
历届试题 分糖果 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边 ...
- hunnu11543:小明的烦恼——分糖果
Problem description 小明在班里一直是个非常公正的孩子.这点同学和老师都非常清楚,这不,老师每周都会从家里带来一些糖果.然后叫小明把糖果分给其它小朋友,但这个班里的同学都有一个非 ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
[LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现 原题: There are N children standing in a line. ...
- bzoj 3232: 圈地游戏
bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...
随机推荐
- Asynchronous module definition
Asynchronous module definition Asynchronous module definition (AMD) is a specification for the progr ...
- 微信小程序 form 组件
表单组件:将组件内用户输入的 <switch> <input> <checkbox> <slider> <radio> <picker ...
- 使用innobackupex基于从库搭建级联从库及一两从
使用innobackupex基于从库搭建mysql主从架构 现有的架构是一主一从,版本为Mysql5.6.37.实施要求是:利用从库,搭建第二个从库,版本为5.7.21 主库:192.168.1.21 ...
- flex 垃圾回收
原文在这里:Garbage Collection with Flex and Adobe Air 我终于有时间来整理在flexcamp上演讲的东西并写篇博客了.就在flexcamp前一个月,我几乎天天 ...
- js中parseInt()与parseFloat(),Number(),Boolean(),String()转换
js将字符串转数值的方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ...
- Zotero引用文献格式(软件学报)
最近在写一篇综述,要处理大量引用文献,选用Zotero作为文献管理工具.在插入参考文献目录时需要遵循格式,奈何网上找不到<软件学报>对应的csl模板文件,所以决定自己动手修改.在此记录下自 ...
- vue中的computed 与 watch
计算属性 computed 指通过计算得来的属性,用于监听属性的变化 computed里面的函数调用的时候 不需要加() 方法里必须有一个返回值 return computed中的函数不会通过事件去触 ...
- Java -Tips
1. /* xxxx */表示多行注释,双斜杠开始表示单行注释.多行注释的快捷键: 先选中多行代码,然后按下ctrl+/就可以把选中的多行代码给注释掉.
- Linux的tail命令查看文件
小文件一般用cat 查看,但是如果文件内容过多,用cat就不合适了 可以用tail命令 # 默认显示文件最后十行 tail a.txt # 监视文件的尾部内容,默认十行, 可以-n 20显示20行 ...
- 项目被os x占用
xattr -d com.apple.FinderInfo 空格后拖入项目回车就行了