HDU 4701 Game 递推+博弈
来源:互联网 发布:图像特征检测算法 编辑:程序博客网 时间:2024/05/18 08:05
点击打开链接
题意:n个物品,每个价值c[i],两人分别有A,B元,每次轮流购买>=1件物品,规则:购买第i(i>1)件时,i-1件必须被购买,不能购买算输
n<=1e6,c[i],A,B<=1e9
首先:如果Alice有x元就能必胜,则有y(y>x)元肯定也能获胜
则设计状态d[i] 在买第i件物品前 必胜所需要的最小价钱
sum[i] 为前i件物品之和 ,若第i件先手时有d[i]元,则对手的钱为y:A+B=y+d[i]+sum[i-1] y=A+B-d[i]-sum[i-1]
递推d[i]: 考虑第i+1件物品是否买.
若不买第i+1件物品 则必须给对手在i+1留下必败态 A+B-d[i]-sum[i-1]<d[i+1]
买第i+1件物品(或者之后的物品) 相当于先转移到dp[i+1]的必胜态 d[i]=d[i+1]+c[i]
#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=1e9+7;const int N=2e6+20;const int M=650;ll c[N],A,B,sum[N],n;ll dp[N];int main(){ while(cin>>n>>A>>B){sum[0]=0;for(int i=1;i<=n;i++)scanf("%I64d",&c[i]),sum[i]=sum[i-1]+c[i];int len=n;for(int i=1;i<=n;i++){//最多买到i-1 if(sum[i]>A+B){len=i-1;break;}}dp[len]=c[len]; for(int i=len-1;i>=1;i--){dp[i]=dp[i+1]+c[i]; ll t=A+B-sum[i-1]-dp[i+1]+1;dp[i]=min(dp[i],t);} if(A>=dp[1])puts("ALICE");elseputs("BOB");}return 0;}
阅读全文
0 0
- HDU 4701 Game 递推+博弈
- hdu 4701 Game----博弈
- poj 1082 Calendar Game 博弈递推
- hdu 2147 博弈递推
- hdu 4701 Game(博弈)
- uva10404 - Bachet's Game(博弈,递推)
- HDU 3389 Game (博弈)
- HDU 5011-Game(博弈)
- HDU-5011 Game 博弈
- hdu 5011 Game(博弈)
- [博弈] hdu 5011 Game
- hdu 3389 Game 博弈
- hdu 5011 Game 博弈
- HDU 5011-Game(博弈)
- HDU 5011 Game (博弈)
- hdu 2177 博弈推状态
- HDU 3469 Catching the Thief (博弈 + DP递推)
- hdu 5754 博弈递推 dfs记忆优化
- 传统企业码农如何跳槽互联网
- jQuery 层次选择器
- std::map 自定义类做为key时 find operator< 的正确写法
- 感知机中损失函数1/||w||可以不考虑(或直接忽略)的原因
- Delphi控件的安装方法
- HDU 4701 Game 递推+博弈
- 1073 家族
- C#中可空值类型的一些细节
- iOS-数据结构
- hdu3338 Kakuro Extension(较难,好题) [最大流][数和]神奇最大流行进列出
- vb.net 教程 3-11 窗体控件综合编程 2-2
- 链表中倒数第k个结点
- iOS 输入金钱数目的TextField
- RabbitMQ第二课--java demo