题目

传送门 to AtCoder

思路

通过手玩,我感受到了一个结论:每次要么拿走一个石子,要么拿走一整堆石子。二者分别用于 “挨时间” 和 “推进度”。但是我并没有给出证明。而这证明,就是最重要的性质:石子数越多,胜率越高

为什么呢?因为石子数变多之后,仍然可以采取相同的策略;只有最后一次,统一成 “拿完整堆石子”。所以一定严格更优。

应当说,这是博弈常见操作:求一个 “分界点”,之前都是 NNN 状态,之后都是 PPP 状态。

接下来我们就可以考虑游戏进程了:双方都在 “挨时间” 的过程不重要,因为终究有一个人会 “挨不赢”(比如,不得已拿完自己所在的那一堆石子)。所以我们只需要考虑 “推进度” 时的局面,比如左手玩家刚拿完一整堆石子——此时剩下的石子堆是 [l,r][l,r][l,r],但是最右边的石子是不完整的。怎么判断?

仍然利用上面的性质:一定存在 vvv 使得最右边的石子堆至少是 vvv 个时,右手玩家(先手)必胜。所以我们只需要求这个,记为 Rl,rR_{l,r}Rl,r​ 。类似的,我们还需要求一个 Ll,rL_{l,r}Ll,r​ 。

怎样转移呢?以 Ll,rL_{l,r}Ll,r​ 为例。假如拿完这一堆就赢,即 Gl+1,r>arG_{l+1,r}>a_rGl+1,r​>ar​,那么 Ll,r=1L_{l,r}=1Ll,r​=1 。否则,一定会进入拉锯战:双方都一个一个拿。那么,当先手这堆石子的数量小于 Ll,r−1L_{l,r-1}Ll,r−1​ 时,后手拿完就赢了;当后手这堆石子的数量小于 Gl+1,rG_{l+1,r}Gl+1,r​ 时,先手拿完就赢了。显然共需要拿 (ar−Gl+1,r+1)(a_r-G_{l+1,r}+1)(ar​−Gl+1,r​+1) 轮,由于此时后手还无法取胜,所以先手最初至少有 Ll,r−1+(ar−Gl+1,r+1)L_{l,r-1}+(a_r-G_{l+1,r}+1)Ll,r−1​+(ar​−Gl+1,r​+1) 个石子,这就是 Ll,rL_{l,r}Ll,r​ 的值。

Rl,rR_{l,r}Rl,r​ 的计算同理。时间复杂度 O(Tn2)\mathcal O(Tn^2)O(Tn2) 。

代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std;
# define rep(i,a,b) for(int i=(a); i<=(b); ++i)
# define drep(i,a,b) for(int i=(a); i>=(b); --i)
typedef long long llong;
inline int readint(){int a = 0, c = getchar(), f = 1;for(; !isdigit(c); c=getchar())if(c == '-') f = -f;for(; isdigit(c); c=getchar())a = (a<<3)+(a<<1)+(c^48);return a*f;
}const int MAXN = 105;
llong l[MAXN][MAXN], r[MAXN][MAXN];
int a[MAXN];int main(){for(int T=readint(); T; --T){int n = readint();rep(i,1,n){a[i] = readint();l[i][i] = r[i][i] = 1;}drep(i,n-1,1) rep(j,i+1,n){if(r[i+1][j] > a[j]) l[i][j] = 1;else l[i][j] = a[j]+l[i][j-1]-r[i+1][j]+1;if(l[i][j-1] > a[i]) r[i][j] = 1;else r[i][j] = a[i]+r[i+1][j]-l[i][j-1]+1;}puts(l[1][n] <= a[1] ? "First" : "Second");}return 0;
}

[AGC048D]Pocky Game相关推荐

  1. HDU 5984 Pocky

    http://acm.hdu.edu.cn/showproblem.php?pid=5984 似乎青岛2016icpc的概率题很多,但这道题是看样例看出来的... 输入L和d, 求一根pocky每次操 ...

  2. HDU - 5984 Pocky(数学推导)

    题干: Let's talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decorati ...

  3. 概率——2016青岛icpc区域赛 C - Pocky HDU - 5984 公式推导

    博客目录 一.原题 原题传送门(vjudge) 原题传送门(杭电原题) Let's talking about something of eating a pocky. Here is a Decor ...

  4. NowCoder110E Pocky游戏 状压DP

    传送门 题意:给出$N$个数和一个长为$M$.所有数在$[1,N]$范围之内的正整数序列$a_i$,求出这$N$个数的一种排列$p_1...p_N$使得$\sum\limits_{i=2}^M |p_ ...

  5. [AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)

    problem AtCoder solution 注意:本题不是平等博弈,因为先手只能取最左边,后手只能取最右边. 设 f[l][r][k]:f[l][r][k]:f[l][r][k]: 只剩下区间 ...

  6. 2016 年 ACM/ICPC 青岛区域赛 Problem C Pocky

    昨晚乱入学弟的训练赛,想了一下这个题.推导的过程中,加深了对公理化的概率论理解.$\newcommand{\d}{\mathop{}\!\mathrm{d}}$ 解法一 考虑 $ d < L$ ...

  7. hdu 5984 Pocky

    点击打开题目链接 这题,,开始还在想推公式,,, 推了一会儿也没推出来, 然后我就发现了 第2个样例 0.6..... 第3个  两倍 第4个 三倍... 然后   突然想到是ln2 ,.....然后 ...

  8. HDU5984 Pocky(期望)

    题意:一个长为LLL的零食,每次选一个点,把其分成两半,并吃掉左边的一半,若剩下的大于ddd就继续分割,否则停止,求分割的期望次数. 题解: 题目给出这么多个样例,其实是可以找规律的(瞎猜). 图片截 ...

  9. 【HDU5984】Pocky(数学)

    记录一个菜逼的成长.. 反正题意我还是没看懂.. 看来我得学一波猜数学公式,orz.. 一个经验,一个教训. #pragma comment(linker, "/STACK:10240000 ...

最新文章

  1. HTML基础学习(一)—HTML
  2. apache2部署django以及静态文件
  3. sql sum嵌套查询+ group by
  4. cannot access xxx的解决办法
  5. python烟花表白_python炫酷烟花表白源代码
  6. 学习笔记7-C语言-进制转换、原返补、位运算、函数
  7. 数据仓库入门(实验10)在Excel中查询层次结构
  8. 工作闲了觉得无聊,忙了觉得累......
  9. 理论基础 —— 二叉树 —— 线索链表
  10. 手机听筒被灰尘堵塞了如何清洗?
  11. (0)C#开发环境构建——史上最容易理解的C#界面搭建
  12. libgdx之瓦片地图(TiledMap)
  13. 明解C语言(基础篇)—第七章
  14. 学习《华为基本法》(大结局):法的修订与接班人
  15. matlab二值化处理、分形维数和结构占比计算
  16. C语言——解四元一次方程组
  17. 点击图片播放音乐实现
  18. python爬取喜马拉雅音频
  19. MAC 设置忽略部分IP代理
  20. 新浪微博密码加密分析

热门文章

  1. 改善编程体验: IdeaVimExtension介绍 1
  2. Java 丢手绢游戏 求和_大班游戏活动_丢手绢
  3. 前端 100 问:能搞懂80%的请把简历给我
  4. <Zhuuu_ZZ>Spark Streaming
  5. 基于springboot的家政系统 毕业设计-附源码201524
  6. 几种常用可视化图表,该怎么用?
  7. Springboot大学生健康报送系统的设计与实现毕业设计源码091005
  8. redis list操作leftpop
  9. 苹果无线耳机使用方法_苹果神器网球http catcher使用方法和规则分享
  10. List(双向链表)