[POI2010]GRA-The Minima Game
阿新 • • 發佈:2017-06-01
++ 個數 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