[BZOJ5046]分糖果游戏
题目大意:
有a,b两个人分糖,每个人都有一个能量值。
每个人每一轮可以选择进行两种操作:
1.取走最左边的糖果,补充相应的能量值并获取相应的美味度。
2.跳过这一轮,能量值-1.
问在每个人都采取最优决策的情况下,每个人能获得最多的美味度是多少?
思路:
动态规划。
f[i][j]表示吃第i~n的糖,并获得j的美味度,两人能量值之差最小是多少。
如果轮到的人选择吃,那么f[i][j]=-f[i+1][suf[i]-j+1]-r[i]+1;
如果不吃,那么f[i][j]=max(f[i+1][j]+r[i]+1,1)。
不吃的时候要满足能量值之差>=1,因为对方同样可以通过不吃补回来。
最后的答案k为满足f[0][k]<=a-b的最大值,糖果最后一定能吃完,所以只要减一下就得到了两个答案。
#include<cstdio>
#include<cctype>
#include<algorithm>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int64 inf=0x4000000000000000ll;
const int N=;
int r[N],s[N],suf[N];
int64 f[][N];
int main() {
const int n=getint(),a=getint(),b=getint();
for(register int i=;i<n;i++) {
r[i]=getint(),s[i]=getint();
}
for(register int i=n-;~i;i--) {
suf[i]=suf[i+]+s[i];
}
for(register int i=;i<=s[n-];i++) {
f[!(n&)][i]=-inf;
}
for(register int i=s[n-]+;i<=suf[];i++) {
f[!(n&)][i]=inf;
}
for(register int i=n-;~i;i--) {
for(register int j=suf[i];~j;j--) {
if(s[i]>=j) {
f[i&][j]=-inf;
while(j--) f[i&][j]=-inf;
break;
}
f[i&][j]=-f[!(i&)][suf[i]-j+]-r[i]+;
if(j<=suf[i+]) {
f[i&][j]=std::min(f[i&][j],std::max(1ll,f[!(i&)][j]+r[i]+));
}
}
}
for(register int i=suf[];~i;i--) {
if(f[][i]<=a-b) {
printf("%d %d\n",i,suf[]-i);
return ;
}
}
}
[BZOJ5046]分糖果游戏的更多相关文章
- soj#547 bzoj5046 分糖果游戏
分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long ; ][],s[],p[],v[]; si ...
- BZOJ 5046 分糖果游戏
网页崩溃了 心态也崩溃了 MD劳资写了那么多 题意: 有a,b两个人分糖,每个人都有一个能量值.每个人每一轮可以选择进行两种操作: 1.取走最左边的糖果,补充相应的能量值并获取相应的美味度. 2.跳过 ...
- CSDN 分糖果算法的思路和求助
昨天晚上 在csdn上做了一道分糖果的题目,我自个测的是没有问题,但是提交答案后,老失败,提示 你的程序正常运行并输出了结果,但是答案错误你的程序输出结果与测试数据中的输出结果不符 我先把自个思路说一 ...
- C语言 · 分糖果
历届试题 分糖果 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一 ...
- 蓝桥杯 历届试题 PREV-32 分糖果
历届试题 分糖果 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边 ...
- hunnu11543:小明的烦恼——分糖果
Problem description 小明在班里一直是个非常公正的孩子.这点同学和老师都非常清楚,这不,老师每周都会从家里带来一些糖果.然后叫小明把糖果分给其它小朋友,但这个班里的同学都有一个非 ...
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
[LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现 原题: There are N children standing in a line. ...
- 牛客 2018NOIP 模你赛2 T2 分糖果 解题报告
分糖果 链接:https://www.nowcoder.com/acm/contest/173/B 来源:牛客网 题目描述 \(N\) 个小朋友围成一圈,你有无穷个糖果,想把其中一些分给他们. 从某个 ...
- 51nod——1402最大值、2479小b分糖果 (套路)
1402最大值:正向从1到n,如果没有限制,就依次递增1,如果有限制,就取那个限制和递增到这的最小值.这样保证1和每个限制点后面都是符合题意的递增,但是限制点前面这个位置可能会有落差(之前递增多了). ...
随机推荐
- 9.1docker容器 跨主机连接
open vswitch 实现跨主机容器连接 准备条件 将本地的网卡 与新建的网桥建立连接 配置 docker 启动项 weave实现跨主机容器连接 null
- 寻找kernel32.dll的地址
为了寻找kernel32.dll的地址,可以直接输出,也可以通过TEB,PEB等查找. 寻找TEB: dt _TEB nt!_TEB +0x000 NtTib : _NT_TIB +0x01c Env ...
- [Leetcode Week14]Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/pr ...
- 微信支付:curl 出错,错误码: 60
在测试微信支付 - 模式二 - 扫码支付时,遇到如下错误: curl出错,错误码:60 这是因为在 WxPay.Api.php 文件中做了严格的 ssl 证书校验: curl_setopt($ch,C ...
- 网络知识===wireshark抓包出现“TCP segment of a reassembled PDU”的解释(载)
网上胡说八道,众说风云,感觉这篇还算靠谱点. 原文链接:http://blog.csdn.net/dog250/article/details/51809566 为什么大家看到这个以后总是会往MSS, ...
- mongodb 学习笔记--- 基础知识
1.mongodb的安装 (1) mac使用brew 安装就好 brew install mongodb (2) mkdir /data/db 作为mongodb默认的数据目录 并 sudo chow ...
- Android 开发之避免被第三方使用代理抓包
现象:charles抓不到包,但wireshark,HttpAnalyzor可以抓到包. 关键代码: URL url = new URL(urlStr); urlConnection = (HttpU ...
- .net连接sql server的几种连接字符串的写法
.net连接sql server的几种连接字符串的写法 1, 混合验证模式登录 server=电脑名 或 电脑IP;database=数据库名;uid=数据库登录名;password=数据库登录密码 ...
- sqlserver2008 死锁解决方法及性能优化方法
sqlserver2008 死锁解决方法及性能优化方法 原文: http://blog.csdn.net/kuui_chiu/article/details/48621939 十步优化SQL Serv ...
- Aspxgridview 根据条件来自定义计算Totalsummery
protected void ASPxGridView1_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEven ...