• BZOJ 2016: [Usaco2010]Chocolate Eating( 二分答案 )


     因为没注意到long long 就 TLE 了...

    二分一下答案就Ok了.. 

    ------------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
     
    #define rep( i , n ) for( int i = 0 ; i < n ; ++i )
    #define clr( x , c ) memset( x , c , sizeof( x ) )
    #define Rep( i , n ) for( int i = 1 ; i <= n ; ++i )
     
    using namespace std;
     
    typedef long long ll;
     
    const int maxn = 50000 + 5;
     
    int n , d;
    int h[ maxn ];
    int ans[ maxn ];
     
    bool jud( ll m ) {
    int cur = 0;
    ll p = 0;
    Rep( i , d ) {
    while( p < m ) {
    if( ++cur > n ) return false;
       p += h[ cur ];
    }
    p >>= 1;
    }
    return true;
    }
     
    void get( ll m ) {
    int cur = 0;
    ll p = 0;
    Rep( i , d ) {
    while( p < m )
       p += h[ ++cur ] , ans[ cur ] = i;
    p >>= 1;
    }
    for( int i = ++cur ; i <= n ; ++i ) ans[ i ] = d;
    }
     
    int main() {
    freopen( "test.in" , "r" , stdin );
    freopen( "test.out" , "w" , stdout );
    ll L = 0 , R = 0;
    cin >> n >> d;
    Rep( i , n ) 
       scanf( "%d" , h + i ) , R += h[ i ];
    ll res;
    while( L <= R ) {
    ll m = ( L + R ) >> 1;
    if( jud( m ) ) 
       res = m , L = m + 1;
    else 
       R = m - 1;
    }
    get( res );
    cout << res << " ";
    Rep( i , n ) printf( "%d " , *( ans + i ) );
    return 0;
    }

      

    ------------------------------------------------------------------------------

    2016: [Usaco2010]Chocolate Eating

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 235  Solved: 90
    [Submit][Status][Discuss]

    Description

    贝西从大牛那里收到了N块巧克力。她不想把它们马上吃完,而是打算制定一个计划,

    使得在接下来的D天里,她能够尽量地快乐。贝西的快乐指数可以用一个整数来衡量,一开始的时候是0,当她每天晚上睡觉的时候,快乐指数会减半(奇数时向下取整)。贝西把她的巧克力按照收到的时间排序,并坚持按照这个顺序来吃巧克力。当她吃掉第i块巧克力的时候,她的快乐指数会增加Hj。每天可以吃任意多块巧克力,如何帮助贝西合理安排,使得D天内她的最小快乐指数最大呢?

        举个例子:假设一共有五块巧克力,贝西打算在五天时间内将它们吃完,每块巧克力提

    供的快乐指数分别为104013227。则最好的方案如F

    天数

    起床时快乐指数

    食用的巧克力

    就寝时快乐指数

        1
        2
        3
        4
        5

        0
        25
        12
        12
        17

        10+ 40
     
        13
        22
        7

        50
        25
        25
        34
        24

    五天内的最小快乐指数为24,这是所有吃法中的最大值。

    Input

      第一行:两个用空格分开的整数:N和D,1≤N.D≤50000
      第二行到第N+1行:第1+1行表示第i块巧克力提供的快乐指数Hj,1≤Hi≤1000000

    Output

      第一行:单个整数,表示贝西在接下来D天内的最小快乐指数的最大值
      第二行到第N+1:在第i+l行有一个整数,代表贝西应该在哪一天吃掉第i块巧克力。
        如果有多种吃法,则输出按照词典序排序后最靠后的方案

    Sample Input

    55
    10
    40
    13
    22
    7

    Sample Output

    24
    1
    1
    3
    4
    5

    HINT

    Source

  • 相关阅读:
    orale 函数大全[转] 涛
    easyuicombobox的option选项为true与false时的问题 涛
    数据库镜像转移Failover Partner 涛
    创建链接服务器 涛
    Sql Server 2008 R2 清空数据库中ldf日志文件 涛
    杂 涛
    Jquery 数组操作大全【转载】 涛
    VS2012常用快捷键 涛
    android studio集成ijkplayer Vevi
    CenOs 部署记录 Vevi
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4593205.html
Copyright © 2020-2023  润新知