bzoj2091 [Poi2010]The Minima Game

 [Poi2010]The Minima Game

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 619  Solved: 425
[Submit][Status][Discuss]

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

Sample Output

2

HINT

 

第一次A取走3,第二次B取走两个1,最终分差为2。

 

Source

 
题解:
    自己比较脑残,想了好久,被一个1,2,3的数据卡住了,为什么答案是2呢?
    可以先选3,然后后者只能选2,1,或者1,不管怎么样,都是2
    就是可以想到是连续一段取数的,那么可以发现,所以开始取当前第i个,那么答案是a[i]-f[i-1],
    以前一起,就是f[i-1],所以取个最大之即可,最后因为A先选,所以答案为f[n]
 1 #include<cstring>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cstdio>
 6 
 7 #define N 1000007
 8 using namespace std;
 9 inline int read()
10 {
11     int x=0,f=1;char ch=getchar();
12     while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();}
13     while(ch<='9'&&ch>='0')
14     {
15         x=(x<<3)+(x<<1)+ch-'0';
16         ch=getchar();
17     }
18     return x*f;
19 }
20 
21 int n;
22 int a[N],f[N],MX;
23 
24 int main()
25 {
26     n=read();for (int i=1;i<=n;i++) a[i]=read();
27     sort(a+1,a+n+1);
28     for (int i=1;i<=n;i++)
29         MX=max(MX,a[i]-f[i-1]),f[i]=MX;
30     printf("%d\n",f[n]);    
31 }

 

posted @ 2017-12-12 18:40  Kaiser-  阅读(136)  评论(0编辑  收藏  举报