我是沙茶,一看,博弈论题,开始推sg函数。。。。。。

然后搞不出,一看ZYF博客,发现是DP。。。(做法都能想错的我真是太弱了)

首先每个人肯定都是从大到小取数,于是先对a[i]排序。

令f[i]表示前i个数去玩的最大差值,则

f[i] = max(f[i - 1], a[i] - f[i - 1])(分别代表这次取得最小数为a[i]和不为a[i]),于是就好了>.<

 

 1 /**************************************************************
 2     Problem: 2091
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:1384 ms
 7     Memory:8616 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <algorithm>
12  
13 using namespace std;
14  
15 int n, a[1000005], f[1000005];
16  
17 int main(){
18     scanf("%d", &n);
19     for (int i = 1; i <= n; ++i)
20         scanf("%d", a + i);
21     sort(a + 1, a + n + 1);
22     for (int i = 1; i <= n; ++i)
23         f[i] = max(a[i] - f[i - 1], f[i - 1]);
24     printf("%d\n", f[n]);
25     return 0;
26 }
View Code


(这种题都做不出来怎么考noip......感觉要爆零)

posted on 2014-10-06 22:17  Xs酱~  阅读(197)  评论(0编辑  收藏  举报