[atcoder002E] Candy Piles [博弈论]】的更多相关文章

题面: 传送门 思路: 每一堆糖排成一列,所有列横着放,形成一个阶梯型 两个决策相当于左边一列去掉和最下面一行去掉 那么这个模型可以转化为同样形状的网格图,向左上方走,走到边界的赢· 然后一波数学推导带走 Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ]; int main(){ scanf("%d",&n); ;i<=…
题意 题目链接 Sol Orz SovitPower #include<bits/stdc++.h> #define Pair pair<int, double> #define MP(x, y) make_pair(x, y) #define fi first #define se second //#define int long long #define LL long long #define Fin(x) {freopen(#x".in","…
题目大意 有\(n\)堆糖果,第\(i\)堆有\(a_i\)个. 两个人轮流决策,决策分为两种: 1.选择糖果数最多的一堆糖果,并把这堆糖全吃了. 2.在每堆非空的糖果堆里拿一颗糖吃掉. 吃掉最后一颗糖的人输.问你先手必胜还是先手必败. \(n\leq 100000\) 题解 又是一个打表结论题. 先把\(a_i\)从大到小排序. 设\(f_{i,j}\)为删掉前\(i\)大,每堆删掉\(j\)个后是先手必胜还是先手必败.先把所有的\(f_{i,j}\)算出来. 如果都删完了,就先手必胜. 打个…
题目链接 \(Description\) 给定\(n\)堆糖,数量分别为\(a_i\).Alice和Bob轮流操作.每次可以吃掉最多的一堆,也可以每堆各吃掉一个.无法操作的人输,求谁能赢. \(n\leq10^5,\ a_i\leq10^9\). \(Solution\) 画这图累死了= = 虽然确实有点丑 假设有\(5\)堆糖,把它画成这样.我们发现每次操作就是拿掉最左边一列或最下边的一行.那么可以看成,初始在\((1,1)\),每次向右或向上走一步. 考虑求\(SG\).边界位置的\(SG\…
神仙题..表示自己智商不够想不到... 好几次读成最后拿的赢了,导致一直没看懂题解... 题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_e 题解: 首先所有数从大到小排序,如果把每个数上面画出高度等于它数值的柱状图,那么就可以得到一条从左上角走到右下角的Lattice Path, 两人从原点开始每一步操作就相当于向右或向上走一格,走到边界的输. 那么朴素的DP是\(O(\sum a_i)\)的,考虑优化: 找规律可得从一个不在边界上的…
有n堆石子,第i堆有ai个石子.有两种操作: 把石子最多的那一堆给丢掉 把每一堆全部丢掉一个 谁拿走最后石子谁输.判断胜负情况. 直觉转化为一个走棋盘问题 考虑如何计算左下角点的状态 找到原点最右上方且不在边界上的点 如果这个点和上方.和右方距离有一个是奇数,那么这个点就是后手必胜点,即First 找上方很容易 找右方,只需要找到第一个小于等于自己的,做差即可 #include <bits/stdc++.h> using namespace std; int n,a[100005]; int…
[Agc002E]Candy Piles 题目大意 有\(n\)个数,两人轮流操作,可以做以下操作之一: 删掉一个最大的数 将所有数-1 最后取没的人输,问先手是否必胜? 试题分析 直接决策不知道选哪一个,又没有其它转化操作的思路,索性排一遍序好了. 然后将这个数值作为y轴画出来一个图表,这个东西可以干什么呢? 发现我们的操作就相当于在这个图标的右下角开始走,每次可以向左走或者向上走,没得可走的人就输了. 然后根据这个必胜和必败的关系我们可以推出一个表来,如果一个位置的上方或者右方有一个为0的,…
Problem Statement There are N piles of candies on the table. The piles are numbered 1 through N. At first, pile i contains ai candies. Snuke and Ciel are playing a game. They take alternating turns. Snuke goes first. In each turn, the current player…
本来实在写不动这题 sol 了,但一想这是个经典的模型转化问题,于是就写了(.jpg) 题意 有一个序列 \(a_i\). 两人轮流操作,每次操作为二选一: 1. 把最大的 \(a_i\) 减成 \(0\) 2. 把所有非 \(0\) 的 \(a_i\) 减去 \(1\) 若一个人操作后,所有 \(a_i\) 都是 \(0\),这个人就输了. 两人都采用轮流策略,问谁能赢. \(n\le 10^5\) \(a_i\le 10^9\) 题解 智商模型转化:把所有 \(a_i\) 从大到小排序,画一…
题目链接 AtCoder:https://agc002.contest.atcoder.jp/tasks/agc002_e 洛谷:https://www.luogu.org/problemnew/show/AT1999 Solution 设\(f[i][j]\)表示拿了\(i\)个最大的,全部减一了\(j\)次先手必胜还是必败. 那么把表打出来可以发现它长这样: 无耻的偷大佬的图 发现必胜或必败状态都是一条一条的,证明比较显然,考虑\(f[i][j]\)可以由\(f[i+1][j],f[i][j…