zoukankan      html  css  js  c++  java
  • 2016: [Usaco2010]Chocolate Eating

    2016: [Usaco2010]Chocolate Eating

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 224  Solved: 87
    [Submit][Status][Discuss]

    Description

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

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

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

    供的快乐指数分别为10,40,13,22,7。则最好的方案如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

    Silver

    题解:一开始很困惑该怎么弄,感觉有点没头绪,直到我发现了这道题的解貌似符合单调性——于是二分答案,先枚举最后结果,然后判断是否合法,然后输出

     1 var
     2    i,j,k,n,d:longint;
     3    l,r,m:int64;
     4    a:array[0..50010] of int64;
     5 function check(x:int64):boolean;inline;
     6          var a1,a2:int64;
     7          begin
     8               a1:=0;a2:=1;
     9               for i:=1 to n do
    10                   begin
    11                        a1:=a1+a[i];
    12                        while (a1>=x) and (a2<=d) do
    13                              begin
    14                                   a1:=a1 div 2;
    15                                   inc(a2);
    16                              end;
    17                        if a2>d then exit(true);
    18                   end;
    19               exit(false);
    20          end;
    21 procedure put(x:int64);inline;
    22           var a1,a2:int64;
    23           begin
    24                a1:=0;a2:=1;
    25                for i:=1 to n do
    26                    begin
    27                         a1:=a1+a[i];
    28                         writeln(a2);
    29                         while (a1>=x) and (a2<d) do
    30                               begin
    31                                    a1:=a1 div 2;
    32                                    inc(a2);
    33                               end;
    34                    end;
    35           end;
    36 begin
    37      readln(n,d);
    38      for i:=1 to n do readln(a[i]);
    39      l:=0;r:=0;
    40      for i:=1 to n do r:=r+a[i];
    41      while l<=r do
    42            begin
    43                 m:=(l+r) div 2;
    44                 if check(m)=false then r:=m-1 else l:=m+1;
    45            end;
    46      writeln(l-1);
    47      put(l-1);
    48 end.
  • 相关阅读:
    linux 命令——48 watch (转)
    linux 命令——47 iostat (转)
    linux 命令——46 vmstat(转)
    linux 命令——45 free(转)
    linux 命令——44 top (转)
    linux 命令——43 killall(转)
    linux 命令——42 kill (转)
    linux 命令——41 ps(转)
    linux 命令——40 wc (转)
    Java for LeetCode 068 Text Justification
  • 原文地址:https://www.cnblogs.com/HansBug/p/4394634.html
Copyright © 2011-2022 走看看