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.
  • 相关阅读:
    yield* 表达式
    Set 对象和WeakSet对象
    洗牌算法
    filter() 方法创建一个新数组
    UTF8文件带BOM引起的问题
    ios的白屏坑
    css的字体样式怎么写
    npm全局安装失效修复
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)解决方案
    linux下nginx的安装及配置
  • 原文地址:https://www.cnblogs.com/HansBug/p/4394634.html
Copyright © 2011-2022 走看看