1. 程式人生 > >[POI2010]GRA-The Minima Game

[POI2010]GRA-The Minima Game

++ 個數 color printf %d std can mini 最優

OJ題號:洛谷3507

如果選了$k_i$,那麽你的對手就可以選上所有$\geq{k_i}$的數。那麽他其中獲得的分數也一定$\geq{k_i}$。

如果你選了$k_i$以及所有$\geq{k_i}$的數,那麽對手無論怎麽選,所獲得的分數都一定$<{k_i}$,無論如何都不會超過你。

因此,若要保證最優,如果選了$k_i$,同時一定要選上所有$\geq{k_i}$的數。

我們可以將這n個數從小到大排序。

設${k_0}\sim{k_i}$中,雙方最大差為$f_i$。易得DP方程$f_i=max(k_j-f_{j-1})(0\leq{j}\le{i})$。

實現上也可以用$ans$維護$f$數組的前綴$max$。

 1 #include<cstdio>
 2 #include<algorithm>
 3 int main() {
 4     int n;
 5     scanf("%d",&n);
 6     int k[n];
 7     for(int i=0;i<n;i++) scanf("%d",&k[i]);
 8     std::sort(&k[0],&k[n]);
 9     int ans=0;
10     for(int i=0;i<n;i++) ans=std::max(ans,k[i]-ans);
11 printf("%d\n",ans); 12 return 0; 13 }

[POI2010]GRA-The Minima Game