• bzoj2091 [Poi2010]The Minima Game


     [Poi2010]The Minima Game

    Time Limit: 10 Sec  Memory Limit: 259 MB
    Submit: 619  Solved: 425
    [Submit][Status][Discuss]

    Description

    给出N个正整数,AB两个人轮流取数,A先取。每次可以取任意多个数,直到N个数都被取走。
    每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大。
    在这样的情况下,最终A的得分减去B的得分为多少。

    Input

    第一行一个正整数N (N <= 1,000,000),第二行N个正整数(不超过10^9)。

    Output


    一个正整数,表示最终A与B的分差。

    Sample Input

    3
    1 3 1

    Sample Output

    2

    HINT

    第一次A取走3,第二次B取走两个1,最终分差为2。

    Source

     
    题解:
        自己比较脑残,想了好久,被一个1,2,3的数据卡住了,为什么答案是2呢?
        可以先选3,然后后者只能选2,1,或者1,不管怎么样,都是2
        就是可以想到是连续一段取数的,那么可以发现,所以开始取当前第i个,那么答案是a[i]-f[i-1],
        以前一起,就是f[i-1],所以取个最大之即可,最后因为A先选,所以答案为f[n]
     1 #include<cstring>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<cstdio>
     6 
     7 #define N 1000007
     8 using namespace std;
     9 inline int read()
    10 {
    11     int x=0,f=1;char ch=getchar();
    12     while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();}
    13     while(ch<='9'&&ch>='0')
    14     {
    15         x=(x<<3)+(x<<1)+ch-'0';
    16         ch=getchar();
    17     }
    18     return x*f;
    19 }
    20 
    21 int n;
    22 int a[N],f[N],MX;
    23 
    24 int main()
    25 {
    26     n=read();for (int i=1;i<=n;i++) a[i]=read();
    27     sort(a+1,a+n+1);
    28     for (int i=1;i<=n;i++)
    29         MX=max(MX,a[i]-f[i-1]),f[i]=MX;
    30     printf("%d
    ",f[n]);    
    31 }
  • 相关阅读:
    02-print的用法
    01-Hello World
    01-查看系统整体性能情况:sar
    03-购物车
    Python之路,Day2
    02-三级菜单
    Python之路,Day1
    loadrunner中配置java脚本环境
    算法
    实现testNg的retry机制
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8029209.html
Copyright © 2020-2023  润新知