我是沙茶,一看,博弈论题,开始推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 }
(这种题都做不出来怎么考noip......感觉要爆零)
By Xs酱~ 转载请说明
博客地址:http://www.cnblogs.com/rausen