bzoj2091 [Poi2010]The Minima Game
[Poi2010]The Minima Game
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 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
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 }