AtCoder - 1999 Candy Piles】的更多相关文章

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…
神仙题..表示自己智商不够想不到... 好几次读成最后拿的赢了,导致一直没看懂题解... 题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_e 题解: 首先所有数从大到小排序,如果把每个数上面画出高度等于它数值的柱状图,那么就可以得到一条从左上角走到右下角的Lattice Path, 两人从原点开始每一步操作就相当于向右或向上走一格,走到边界的输. 那么朴素的DP是\(O(\sum a_i)\)的,考虑优化: 找规律可得从一个不在边界上的…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 堆糖果,第 i 堆包含 ai 个糖果. 现在两人进行博弈.有两种操作选择: (1)吃掉包含最多糖果的糖果堆. (2)每堆吃掉一颗. 吃掉最后一颗糖的人判输,问谁必胜? 原题传送门. @solution@ 将 n 个数从大到小排好序,看成一个 n 列的直方图,第 i 列包含 a'i 个格子. 举个例子:对于 5 5 3 2 1 1,可以建立直方图如下:…
[Agc002E]Candy Piles 题目大意 有\(n\)个数,两人轮流操作,可以做以下操作之一: 删掉一个最大的数 将所有数-1 最后取没的人输,问先手是否必胜? 试题分析 直接决策不知道选哪一个,又没有其它转化操作的思路,索性排一遍序好了. 然后将这个数值作为y轴画出来一个图表,这个东西可以干什么呢? 发现我们的操作就相当于在这个图标的右下角开始走,每次可以向左走或者向上走,没得可走的人就输了. 然后根据这个必胜和必败的关系我们可以推出一个表来,如果一个位置的上方或者右方有一个为0的,…
题目链接 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…
题意 题目链接 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\…
题目大意:把$x$个糖果分给$n$个人,必须分完,如果第$i$个人拿到$a_i$个糖果,就会开心,输出最多多少人开心 题解:从小到大排序,判断是否可以让他开心,注意最后判断是否要少一个人(没分完) 卡点:无 C++ Code: #include <cstdio> #include <algorithm> #define maxn 111 int n, x, ans; int a[maxn]; int main() { scanf("%d%d", &n,…
题面: 传送门 思路: 每一堆糖排成一列,所有列横着放,形成一个阶梯型 两个决策相当于左边一列去掉和最下面一行去掉 那么这个模型可以转化为同样形状的网格图,向左上方走,走到边界的赢· 然后一波数学推导带走 Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ]; int main(){ scanf("%d",&n); ;i<=…