跳到正文
Carol's Blog
返回

贪心的猴子

题目

来源 problem/week-1-1

描述

在动物园中,一群猴子排队领香蕉,每只猴子都有一个最少的香蕉需求量。

猴子很贪心,每只猴子拿香蕉时可能会拿多于自己最少需求量的香蕉。

每只猴子就算多拿香蕉,拿的香蕉数目也不会超过自身需求量的两倍,同时也不会超过剩余香蕉数量的一半

最后一只猴子是例外,他可以把所有剩余的香蕉都拿走。


如果你是动物园饲养员,负责为猴子准备香蕉,在已知猴子总数每只猴子的最少香蕉需求量时,

至少准备多少香蕉,才能保证每只猴子拿到的香蕉都能满足自己的需求。

输入

第一行:整数nn,表示猴子的总数,0n1000\le n\le100

第二行:nn个整数,第ii​​个整数为eie_i,表示第ii只猴子的最少香蕉需求量,1ei10001\le e_i \le 1000

输出

输出一整数,表示最少需要准备的香蕉的数量。

样例

输入样例1

3
1 4 3

输出样例1

10

其他样例见 problem/week-1-1

解析

解决问题的方法不唯一,我这里展示的一定不是最优解法。

符号说明

符号备注
ii猴子序号,从00n1n-1
eie_iii只猴子香蕉的最小需求量
EiE_iii只猴子实际拿的香蕉数量
RiR_i该第ii只猴子拿香蕉时,所剩余的香蕉数量

关系表述

用以上定义的符号去表述问题中描述的关系

关系1

猴子拿香蕉时,香蕉剩余量必须大于等于猴子最小需求量

RieiR_i \ge e_i

关系2

对于i[0,n1)i \in [0, n -1)​​,每只猴子实际拿的香蕉数量满足

eiEimin{2ei,Ri/2}e_i \le E_i \le \min \{2 e_i, \lfloor R_i / 2 \rfloor\}

关系3

对于i=n1i = n-1,即最后一只猴子

Ei=RiE_i = R_i

关系4

对于i[0,n1)i \in [0, n - 1)​ 满足

Ri=k=in1EkR_i = \sum_{k = i}^{n - 1} E_k

关系解析

解析1

对于i[0,n1)i \in [0, n - 1)​,每只猴子足够贪婪,永远会选择当前最优选择

关系1关系2可知

Ei=min{2ei,Ri/2}eiE_i = \min\{2e_i, \lfloor R_i / 2 \rfloor \} \ge e_i

引入关系4,将RiR_i替换为EiE_i的表达式

Ei=min{2ei,k=in1Ek/2}eiE_i = \min\{2e_i, \lfloor \sum_{k = i}^{n - 1} E_k / 2 \rfloor \} \ge e_i

解析2

关系1关系3可知

En1=Rn1en1E_{n - 1} = R_{n - 1} \ge e_{n - 1}

目标分析

综合解析1解析2可得

观察可知,EiE_i​由En1E_{n - 1}​和eie_i​决定,而eie_i​已知,故将En1E_{n-1}​看做未知量进行推导。


对于i[0,n1)i\in[0, n-1)​​,当k=in1Ek/22ei\lfloor \sum_{k = i}^{n - 1} E_k / 2 \rfloor \le 2e_i​​​​时

EiE_i可以由EkE_k表出,k[i+1,n1]k \in [i + 1, n - 1]

观察奇数偶数假设

局部最优

对于i[0,n1)i \in [0, n -1),将En1E_{n-1}ii看做自变量,EiE_i看做因变量

可得函数关系:

Ei=f(En1,i)=min{2ei,k=i+1n1Ek1,k=i+1n1Ek}eiE_i = f(E_{n-1}, i) = \min\{2e_i, \sum_{k = i + 1}^{n-1}E_k - 1, \sum_{k = i + 1}^{n-1}E_k\} \ge e_i

如果控制En1E_{n-1}​​的量,使得每只猴子实际能拿的最多的香蕉的数量最少,则认为整体香蕉的消耗量最少,即局部最优等于全局最优

即对于给定ii​,求解En1E_{n-1}

arg minf(En1,i):={En1En1en1:f(En1)ei}{\operatorname {arg\,min} }\,f(E_{n-1}, i):=\{E_{n-1}\mid E_{n-1} \ge e_{n-1}:f(E_{n-1})\geq e_i\}

分享这篇文章:
通过邮件分享这篇文章

分享到微信

微信对普通网页没有开放通用直连分享协议。更稳妥的方式是复制链接、扫码打开,或在支持的设备上调用系统分享。

上一篇
研究生生活开端
下一篇
对SCU网络服务安全性的第一次探索