bzoj2091: [Poi2010]The Minima Game DP

本文介绍了一个名为《The Minima Game》的问题解决思路与代码实现。该问题要求找到一系列数值中先手玩家能达到的最大值。文章首先对输入数据进行排序,并通过动态规划的方法求解最优解。最终给出了完整的C++代码实现。

2091: [Poi2010]The Minima Game DP

链接

https://www.lydsy.com/JudgeOnline/problem.php?id=2091

思路

这类问题好迷呀。
我们先从小到大sort
先手一定是个后缀。
因为你不能留下大数让对手选呀。
然后后手就在你选择的i前面选([1,i-1])后手及其之后的操作。
f[i]表示前i个里面先手的最大值
f[i]=min(f[i-1],a[i]-f[i-1])
要不这个i点没有贡献,先手是f[i-1],要不就是选这个点,后手是f[i-1]

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+7;
int read() {
    int x=0,f=1;char s=getchar();
    for(;s>'9'||s<'0';s=getchar()) if(s=='0') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    return x*f;
}
int n,a[N];
ll f[N],ans;
int main() {
    n=read();
    for(int i=1;i<=n;++i) a[i]=read();
    sort(a+1,a+1+n);
    for(int i=1;i<=n;++i) f[i]=max(f[i-1],a[i]-f[i-1]);
    cout<<f[n];
    return 0;
}

转载于:https://www.cnblogs.com/dsrdsr/p/10623608.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值