hdu 4701 Game(博弈)
2015-11-12 14:47
260 查看
题目链接:hdu 4701 Game
代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 1e6 + 5; /* * S(i) 表示第i件物品到第N件物品的价值和 * win(i, x, y) 表示当前可以买的物品为i,先手剩x元,后手剩y元时,先手是否必胜 * x + y = A + B - S(1) + S(i); * 所以win(i, x, y) 可以化简为win(i, x) * 并且win(i, x) ==> win(i, x+1) * * 记m(i)为min{x: win(i, x)},则有!win(i, x) <==> x < min(i) * D = A + B - S(1) + S(i) * * m(i) = min{x:x >= S(i) - S(j) && j > i && !win(j, D-x)} * = min{x:x >= S(i) - S(j) && j > i && D - x <= m(j) - 1} * = min{x: max(S(i)-S(j), A + B - S(1) + S(i) - m(j) + 1) && j > i} * = S(i) + min{ max(-S(j), A + B - S(1) - m(j) + 1) | j > i} * * 最后只要判断A是否大于m(1)即可 */ int N, A, B; ll S[maxn]; int main () { while (scanf("%d%d%d", &N, &A, &B) == 3) { for (int i = 0; i < N; i++) scanf("%lld", &S[i]); ll pre = S = 0, now; for (int i = N-1; i >= 0; i--) S[i] += S[i+1]; for (int i = N-1; i >= 0; i--) { now = pre + S[i]; pre = min(pre, max(-S[i], (ll)A + B - S[0] + 1 - now)); } printf("%s\n", A >= now ? "ALICE" : "BOB"); } return 0; }
相关文章推荐
- Java 调用 Hbase API 访问接口实现方案
- XtraBackup使用手册
- SectionIndexer
- android微信登录,分享
- android微信登录,分享
- sass与compass简单教程
- 产品学习:智慧城市生活系统设计
- SignalR在Xamarin Android中的使用
- Top 15 不起眼却有大作用的 .NET功能集
- 托管代码和非托管代码
- springsecurity自定义登录界面
- Embree:照片级光线追踪内核
- hdu 4700 Flow (构造)
- C++ 链表的递归逆转和循环逆转
- 位运算相关知识讲解
- Eclipse中导入MyBatis Mapper DTD
- UIView 控件
- JAVA设计模式之单例模式
- 冒泡排序语法树
- 微异构Embree照片级光线追踪解决方案