显然每次都取排序后包含最大值的连续的一段数。
f[i]表示对于剩下的最小的i个数,先手最多比后手多多少分。
f[i]=min{a[j+1]-f[j]}...j<i,a升序排序。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define ll long long 6 using namespace std; 7 const int maxn=1e6+23; 8 ll f[maxn],mx; 9 int a[maxn]; 10 int i,j,k,n,m; 11 12 int ra;char rx; 13 inline int read(){ 14 rx=getchar(),ra=0; 15 while(rx<'0'||rx>'9')rx=getchar(); 16 while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra; 17 } 18 int main(){ 19 n=read(); 20 for(i=1;i<=n;i++)a[i]=read(); 21 sort(a+1,a+1+n); 22 for(i=1;i<=n;i++)mx=max(mx,a[i]-f[i-1]),f[i]=mx; 23 printf("%lld ",f[n]); 24 }