【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\n" , f[n]);
    return 0;
}
posted @ 2017-02-15 15:33  GXZlegend  阅读(274)  评论(0编辑  收藏  举报