[bzoj2091] [Poi2010]The Minima Game

  显然每次都取排序后包含最大值的连续的一段数。

  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\n",f[n]);
24 }
View Code

 

posted @ 2016-06-18 16:38  czllgzmzl  阅读(206)  评论(0编辑  收藏  举报