Description
给出N个正整数,AB两个人轮流取数,A先取。每次可以取任意多个数,直到N个数都被取走。
每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大。
在这样的情况下,最终A的得分减去B的得分为多少。
Input
第一行一个正整数N (N <= 1,000,000),第二行N个正整数(不超过10^9)。
Output
一个正整数,表示最终A与B的分差。
Sample Input
3
1 3 1
1 3 1
Sample Output
2
HINT
第一次A取走3,第二次B取走两个1,最终分差为2。
题解:
首先可以发现每次每个人一定是取走最大的几个数.
所以我们可以倒着考虑.设f[i]表示选到第i个数,两个人差的最大值.
f[i]=max(a[j+1]-f[j])(0<=j<i)
dp过程中维护一下最大值即可.
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 1000010
using namespace std;
int a[N],f[N],mx,n;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);mx=a[1];
for (int i=1;i<=n;i++){
f[i]=mx;
mx=max(mx,a[i+1]-f[i]);
}
cout<<f[n]<<endl;
}