【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; }