首页 > 其他分享 >ABC 270 D - Stones(博弈DP)

ABC 270 D - Stones(博弈DP)

时间:2022-11-09 21:22:47浏览次数:84  
标签:Stones Sample ABC const cout LL 石子 cin 270

https://atcoder.jp/contests/abc270/tasks/abc270_d

题目大意:

给定我们总共n个石子,我们每次拿的数量都必须是数组a中的一个,高桥先手,青木后手。

问我们高桥可以拿到的最大数量的石子数是多少?
Sample Input 1 
10 2
1 4
Sample Output 1 
5

Sample Input 2  
11 4
1 2 3 6
Sample Output 2  
8

详解见代码注释

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL INF=1e9;
const LL N=5000200,M=2002;
LL a[N],f[N];
//f[i]表示石子总个数为i时先手能拿到的最多石子数
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n,k;
        cin>>n>>k;
        for(int i=1;i<=k;i++)
        {
            cin>>a[i];
        }
        f[0]=0;
        for(LL i=1;i<=n;i++)//依次枚举石子数
        {
            for(LL j=1;j<=k;j++)//假设我们选了第j个操作
            {
                if(i>=a[j])//而且当前是可取的话
                {
                    //那么我们将多获得a[j]个石头
                    //轮到对面的时候,对面肯定是会让自己最多
                    //所以对面肯定拿的石头数量是f[i-a[j]]
                    //所以我们能够拿到的石头数量就是a[j]+(i-a[j])-f[i-a[j]]

                    //f[i]=max(f[i],a[j]+(i-a[j])-f[i-a[j]]);
                    f[i]=max(f[i],i-f[i-a[j]]);
                }
            }
        }
        cout<<f[n]<<endl;
    }
    return 0;
}

标签:Stones,Sample,ABC,const,cout,LL,石子,cin,270
From: https://www.cnblogs.com/Vivian-0918/p/16875211.html

相关文章

  • ABC242F
    套路的二项式反演。题目要求实际就是两种颜色的棋子所占的行和列都不能有交。设\(f(i,j,k)\)表示在\(i\)行\(j\)列中放\(k\)个棋子使得每行,每列都不为空的方案数......
  • ABC241G
    假设当前在确定玩家\(p\)是否能成为唯一的赢家。假设\(p\)能赢下所有不确定的比赛,令\(win\)表示他赢的数量。如果\(win=0\)显然他不能成为唯一的赢家,下面都假设......
  • ABC231G
    先来研究没有初始球情况下的简单版本:\(n\)个小球,\(m\)个盒子,每个小球等概率地放到盒子里,这样有\(n^m\)种方案,每种方案的贡献是每个盒中球个数的乘积,计算所有方案贡献......
  • R语言近似贝叶斯计算MCMC(ABC-MCMC)轨迹图和边缘图可视化
    近似​​贝叶斯​​计算和近似技术基于随机模拟模型中的样本计算近似似然值,在过​​去几年中引起了很多关注,因为它们有望为任何随机过程提供通用统计技术。一位同事向我询问......
  • ABC235G
    首先有一个\(\mathcalO(N^2)\)做法。考虑容斥掉条件一,令\(g(i)\)表示恰好有\(i\)个花园空着,\(f(i)\)表示至少有\(i\)个花园空着。则有\(g(0)=\sum\limits_{i=......
  • ABC267G
    考虑重新刻画一个序列的生成,设原数列为\((0,0)\),将所有数从小到大排序后依次加入。例如\((2,3,1)\)是这样生成的:\[(0,0)\to(0,1,0)\to(0,2,1,0)\to(0,2,3,1,0)\]于是......
  • 题解 ABC154F【Many Many Paths】
    problem令\(f(i,j)\)表示,在平面直角坐标系中,从\((0,0)\)出发,每次向上或向右走一步,到达\((i,j)\)的方案数,求:\[\sum_{l_1\leqi\leqr_1}\sum_{l_2\leqj\leqr_2}f(......
  • ABC229G
    首先显然能想到二分,随后想想怎么判定。这里我卡住了(看了题解发现是一个常用的技巧。先把所有\(Y\)的位置存下来,记为数组\(A\),记\(B_i=A_i-i\),那么发现交换就相当于......
  • ABC229F
    首先题目要求删去边权和最小的边使得图变成一张二分图,那么看到二分图就想到染色,那么题目的意思就是让同色节点之间的边权之和最小。不失一般性的,强制\(0\)节点为白色。......
  • ABC 276 ABCDE(dfs)
    A-Rightmost#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18;constLLINF=1e9;constLLN=5000......