zoukankan      html  css  js  c++  java
  • 【bzoj2091】[Poi2010]The Minima Game dp

    题目描述

    给出N个正整数,AB两个人轮流取数,A先取。每次可以取任意多个数,直到N个数都被取走。
    每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大。
    在这样的情况下,最终A的得分减去B的得分为多少。

    输入

    第一行一个正整数N (N <= 1,000,000),第二行N个正整数(不超过10^9)。

    输出

    一个正整数,表示最终A与B的分差。

    样例输入

    3
    1 3 1

    样例输出

    2


    题解

    dp

    不妨倒着想,设f[i]为剩余前i小的数时先手与后手的最大差值。

    由于先手取完之后后手就变成了先手,所以这个状态对双方都成立。

    于是有f[i]=max{a[j]-f[j-1]}。(后手取到j-1,先手从j开始取)。

    然后维护一个最大值,这里直接用f数组来维护最大值,应该不难理解。

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int a[1000001] , f[1000001];
    int main()
    {
        int n , i;
        scanf("%d" , &n);
        for(i = 1 ; i <= n ; i ++ )
            scanf("%d" , &a[i]);
        sort(a + 1 , a + n + 1);
        for(i = 1 ; i <= n ; i ++ )
            f[i] = max(f[i - 1] , a[i] - f[i - 1]);
        printf("%d
    " , f[n]);
        return 0;
    }
  • 相关阅读:
    "etc/profile" E212: Can't open file for writing
    Swift 判断是否是调试模式以及是否越狱
    密码技术之基本介绍
    算法
    App Thinning (App 瘦身)
    #pragma once vs #ifndef
    APUE学习之进程控制
    Socket编程-基础使用
    Link Script 学习
    PX4学习之-uORB msg 自动生成模板解读
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6401659.html
Copyright © 2011-2022 走看看