zoukankan      html  css  js  c++  java
  • 【USACO 2020 January Silver】Berry Picking 题解

    题目描述

    Bessie 和她的妹妹 Elsie 正在 Farmer John 的浆果园里采浆果。Farmer John 的浆果园里有 N 棵浆果树(1≤N≤1000);树 i 上有 Bi 个浆果(1≤Bi≤1000)。Bessie 有 K 个篮子(1≤K≤1000,K 为偶数)。每个篮子里可以装同一棵树上采下的任意多个浆果,但是不能装来自于不同的树上的浆果,因为它们的口味可能不同。篮子里也可以不装浆果。
    Bessie 想要使得她得到的浆果数量最大。但是,Farmer John 希望 Bessie 与她的妹妹一同分享,所以 Bessie 必须将浆果数量较多的 K/2 个篮子给 Elsie。这表示 Elsie 很有可能最后比 Bessie 得到更多的浆果,这十分不公平,然而姐妹之间往往就是这样。
    帮助 Bessie 求出她最多可以得到的浆果数量。

    输入
    输入的第一行包含空格分隔的整数 N 和 K。
    第二行包含 N 个空格分隔的整数 B1,B2,…,BN。
    
    输出
    输出一行,包含所求的答案。
    
    样例输入
    5 4
    3 6 8 4 2
    
    样例输出
    8
    
    数据范围限制
    测试点 1-3 满足 K≤10。
    测试点 4-10 没有额外限制。
    
    提示
    如果 Bessie 在一个篮子里装树 2 的 6 个浆果
    两个篮子里每个装树 3 的 4 个浆果
    一个篮子里装树 4 的 4 个浆果
    那么她能够得到两个各装有 4 个浆果的篮子,总共 8 个浆果。
    

    思路:

    通过题目容易发现Bessie能够得到的数量会在所有篮子中的果实数量尽可能相同时最大化。

    那么我们可以将Bi从大到小排序。

    然后我们从1到最大的Bi枚举每个篮子至少拥有的果实数量i。

    遍历每棵树可得到其能取到的所有桶数t。
    1.
    若t不够k/2,那么Bessie能拿到的个数等于0:,若t>k/2 且 t<k,这个区间内的值为所取得的(t-k/2) * i + 从余数中找(k-t)个最大值,当t>=k时,能拿到的个数为i * (k/2)。

    实现:

    1. 枚举i=1~maxb,求出其能取到的所有桶数t,并用c数组存下余数。
    2. 如果t<k/2,对于i的最大值为0。
    3. 如果t>k/2&&t<k,对于i的最大值为(t-k/2)* i+从余数中找(k-t)个最大值。
    4. 如果t>k,对于i的最大值为i * k/2。
    5. 最后输出每个i的最大值。
  • 相关阅读:
    SSD论文优秀句子
    A Case Study -- Performance Evaluation of a DRAM-Based Solid State Disk
    A Case for Flash Memory SSD in Enterprise Database Applications
    Understanding Manycore Scalability of File Systems
    slabs.c
    背包九讲
    redis async client 与自有框架集成
    同步git修改文件到远端服务器脚本
    服务发现:Zookeeper vs etcd vs Consul
    Linux 常用工具贴
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13159905.html
Copyright © 2011-2022 走看看