分析:
既然有极大极小搜索,那也可以有极大极小DP。。。
很显然的性质:每次拿的人必然拿的是最大的那堆数。
然后就可以DP了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define SF scanf
#define PF printf
#define MAXN 1000010
using namespace std;
int a[MAXN],dp[MAXN][2];
int n;
int main(){
SF("%d",&n);for(int i=1;i<=n;i++)SF("%d",&a[i]);int minv=0,maxv=0;sort(a+1,a+1+n);n=unique(a+1,a+1+n)-a-1;for(int i=1;i<=n;i++){
minv=min(minv,dp[i-1][1]-a[i]);maxv=max(maxv,dp[i-1][0]+a[i]);dp[i][0]=minv;dp[i][1]=maxv;}PF("%d\n",dp[n][1]);
}