卧薪尝胆,厚积薄发。
POI2010 GRA-The Minima Game
Date: Wed Sep 19 11:10:05 CST 2018
In Category:
NoCategory
Description:
$N$
个正整数,每次可以取任意多个数,每次获得的得分为取的数中的最小值,
$A$
和
$B$
的策略都是尽可能使得自己的得分减去对手的得分更大。求最终
$A$
的得分减去
$B$
的得分。
$1\le n \le 1000000$
Solution:
所有人都一定是按从大到小的顺序每次选连续的一段,所以先按从小到大排序,设
$f[i]$
表示到了
$i$
差最大是多少,转移为
$f[i]=\max(a[j]-f[j-1])(1\le j<i)$
,这样转移是
$O(n^2)$
的,但是发现可以用前缀最大值优化,转移实际上是
$f[i]=\max(f[i-1],a[i]-f[i-1])$
。
Code:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n;
#define MAXN 1000010
int a[MAXN];
int f[MAXN];
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
sort(a + 1,a + 1 + n);
f[0] = 0;
for(int i = 1;i <= n;++i)
f[i] = max(f[i - 1],a[i] - f[i - 1]);
cout << f[n] << endl;
return 0;
}
In tag:
DP-前缀和优化DP
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡