zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Vue移动端调用高德获取当前定位城市
    var,let,const三者的区别
    JVM学习与总结一
    五层网络模型整理
    功能强大的CFR反编译工具
    jad 反编译 jar文件、批量、单个class文件,秒懂!
    [ERROR] 2020-08-03 10:18:11 [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:350) Context initialization failed
    TortoiseSVN的bin目录下没有 svn.exe 问题;Error running 'tomcat8.0.47': Unable to open debugger port (127.0.0.1:57422): java.net.SocketException "socket closed";端口被占用问题
    显示数据时,将同列不同行的数据合并到其中一行的sql
    java.lang.IllegalArgumentException: ServletContext must not be null
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4593205.html
Copyright © 2011-2022 走看看