首页 > 其他分享 >[AGC048D] Pocky Game 题解

[AGC048D] Pocky Game 题解

时间:2024-01-19 15:24:58浏览次数:25  
标签:ch int 题解 石子 取完 long AGC048D Game define

题目链接

点击打开链接

题目解法

好难的题,想不出来一点!!!

首先给出一个第一个结论:最优策略下,每个人每次只会取一个石子或者取完一堆石子
题解区都没有严谨证明,\(at\) 的 \(editorial\) 也没证,所以我只能感性理解:
下面以先手为例。如果最左边的石子数 \(>\) 其余所有堆的石子数,那么先手只要一个一个取完这堆,就是必胜的
先手需要找到这样的一堆石子满足上面的条件,但在找到之前,它需要用前面的石子堆和后手消耗,最优的策略是:一次要么取一个消耗,要么全部取完赶到目标的石子堆,不可能出现取 \(>1\) 个但不取完的情况

第二个结论是:以先手为例,先手当前的石子堆的大小越大越好
有了第一个结论,这一个结论就不难说明了
如果当前的石子堆是目标堆,那么显然越大越好
如果不是,那么可以消耗的石子多,如果不用消耗,可以直接取完,所以也是越大越好

下面的我还是想不到 /ll
考虑一个 \(dp\)
令 \(f_{l,r}\) 为当前是先手操作,先手占据第 \(l\) 堆,后手占据第 \(r\) 堆,且 \([l+1,r]\) 堆都没动过,第 \(l\) 堆至少需要的石子数,同理定义 \(g_{l,r}\) 表示当前是后手操作,先手占据第 \(l\) 堆,后手占据第 \(r\) 堆,且 \([l,r-1]\) 堆都没动过,第 \(r\) 堆至少需要的石子数
考虑转移,这里以 \(f_{l,r}\) 为例

  • \(g_{l+1,r}>a_r\),那么就是说,先手取完第 \(l\) 堆的话,先手必胜,所以 \(f_{l,r}=1\)
  • \(g_{l+1,r}\le a_r\),那么先手肯定是需要一个一个取来消耗,后手从 \(a_r\) 开始取,最优肯定是一个一个取到 \(g_{l+1,r}\),然后取完,所以步数为 \(a_r-g_{l+1,r}+1\),所以 \(f_{l,r}=f_{l,r-1}+a_r-g_{l+1,r}+1\)

边界是 \(f_{i,i}=1\)
如果 \(f_{1,n}\le a_1\),先手必胜,否则后手必胜

时间复杂度 \(O(Tn^2)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=110;
int a[N];
LL f[N][N],g[N][N];
void work(){
    int n=read();
    F(i,1,n) a[i]=read();
    F(i,1,n) f[i][i]=g[i][i]=1;
    F(len,2,n) F(l,1,n-len+1){
        int r=l+len-1;
        //f[l][r]
        if(g[l+1][r]>a[r]) f[l][r]=1;
        else f[l][r]=a[r]-g[l+1][r]+1+f[l][r-1];
        //g[l][r]
        if(f[l][r-1]>a[l]) g[l][r]=1;
        else g[l][r]=a[l]-f[l][r-1]+1+g[l+1][r];
    }
    if(f[1][n]>a[1]) puts("Second");
    else puts("First");
}
int main(){
    int T=read();
    while(T--) work();
    return 0;
}

标签:ch,int,题解,石子,取完,long,AGC048D,Game,define
From: https://www.cnblogs.com/Farmer-djx/p/17974665

相关文章

  • 题解 WD与数列
    P5161WD与数列可以想到原条件是一个差分形式,所以我们对原数组差分。然后发现答案其实就是\(\sum_{i<j}\min(lcp(i+1,j+1)+1,j-i)\)。这个东西先跑SA,然后建笛卡尔树。考虑对于一个区间,其值为\(x\)。那么相当于是求\(\sum_{l\inS,r\inT}\min(|sa_{l}-sa_{r}|,x)\)。笛......
  • AT_arc115_b [ARC115B] Plus Matrix 题解
    AT_arc115_b[ARC115B]PlusMatrix题解题意给定矩阵\(C_{n\timesn}\),求两个数列\(A_n,B_n\),使得\(C_{i,j}=A_i+B_j\)。分析画出一个表格来:213243502131324可以看出来,对于任意一列\(j\),\(C_{*,j}\)都存在有\(B_j\)的贡献。那么我们......
  • ELK之Filebeat自动断开问题解决
     自动断开命令 解决自动断开命令nohup./filebeat-e-cfilebeat.yml>./filebeat.log 2>&1& disown 其他的方式(目前我没有使用) 在linux操作系统/etc/systemd/system目录下创建一个filebeat.service文件,写入如下内容需要注意替换文件的位置以及版本[Unit]D......
  • GDKOI 2024 题解
    鸽了一些题。匹配先抽出来一个完美匹配,然后尝试调整。调整相当于:找一个偶环,满足匹配的边和未匹配的边交错,且偶环的总异或和为\(0\),是不是写个暴力就好了?发现冲过去了,很牛逼,复杂度\(O(n^3)\)(?),Code。不休陀螺一个区间可以被打出的条件是:令\(\Delta_i=b_i-a_i\),则\(x=\sum......
  • 13 Jellyfish and Game
    JellyfishandGame因为n,m很小,所有直接暴力就行#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ intn,m,k; cin>>n>>m>>k; vector<int>a(n+1); vector<int>b(m+1); for(inti=1;i<=n;i++)cin>......
  • P2580 于是他错误的点名开始了题解
    “普及/提高-”这个难度很有意思。说明这题可能需要用到提高组当中比较基础的内容。它的名字叫做map。map,其实相当于一个超大数组,但它真实的作用是:映射。比如a[7]=5;就是用a数组把7和5关联了起来,这个操作就叫映射。map这东西NB的地方在于,它能这么写:score["Leo201......
  • P9012 [USACO23JAN] Moo Operations B题解
    第1道赛场AC的题,必须发篇题解记录一下。Tips:\(1\le|S|\le100\)——题目才100,这就可以随便整活了。如果你稍微懂点英语,就会知道第\(2\sim4\)个点的\(S\)都最多只有\(3\)个字符,而目标“MOO”也是\(3\)个字符,所以只需要模拟就可以了。intcheck(string......
  • [GFCTF 2021]web部分题解(更新中ing)
    [GFCTF2021]Baby_Web拿源码环节:打开环境(◡ᴗ◡✿)乍一看什么都没有,F12下没看到js文件,但是看到了出题师傅的提示:“源码藏在上层目录xxx.php.txt里面,但你怎么才能看到它呢?”这时候在思考文件在上层目录中,既然是目录下那就试一下dirsearch扫描先看看后台都有什么(这里就直接......
  • Dojoup 安装问题解决
    Dojoup安装问题解决InstallDojouphttps://book.dojoengine.org/getting-started/quick-start.htmlcurl-Lhttps://install.dojoengine.org|bash安装失败dojoup═══════════════════════════════════════════════......
  • Oozie重试任务不生效问题解决
    1、oozie默认为不重试规则,想要重试需在action中配置重试规则,示例如下:retry-max="3"retry-interval="1"发现增加以上配置后,任务失败并未生效;2、在~/oozie/conf/oozie-site.xml中增加以下配置:<property><name>oozie.service.LiteWorkflowStoreService.user.retry.error.cod......