先上題目:
現(xiàn)有一臺(tái)飲水機(jī)队萤,可以制備冷水、溫水和熱水矫钓。每秒鐘要尔,可以裝滿 2 杯 不同 類型的水或者 1 杯任意類型的水。
給你一個(gè)下標(biāo)從 0 開始新娜、長度為 3 的整數(shù)數(shù)組 amount 赵辕,其中 amount[0]、amount[1] 和 amount[2] 分別表示需要裝滿冷水概龄、溫水和熱水的杯子數(shù)量还惠。返回裝滿所有杯子所需的 最少 秒數(shù)。
示例 1:
輸入:amount = [1,4,2]
輸出:4
解釋:下面給出一種方案:
第 1 秒:裝滿一杯冷水和一杯溫水私杜。
第 2 秒:裝滿一杯溫水和一杯熱水蚕键。
第 3 秒:裝滿一杯溫水和一杯熱水救欧。
第 4 秒:裝滿一杯溫水。
可以證明最少需要 4 秒才能裝滿所有杯子锣光。
示例 2:
輸入:amount = [5,4,4]
輸出:7
解釋:下面給出一種方案:
第 1 秒:裝滿一杯冷水和一杯熱水笆怠。
第 2 秒:裝滿一杯冷水和一杯溫水。
第 3 秒:裝滿一杯冷水和一杯溫水誊爹。
第 4 秒:裝滿一杯溫水和一杯熱水蹬刷。
第 5 秒:裝滿一杯冷水和一杯熱水。
第 6 秒:裝滿一杯冷水和一杯溫水频丘。
第 7 秒:裝滿一杯熱水箍铭。
示例 3:
輸入:amount = [5,0,0]
輸出:5
解釋:每秒裝滿一杯冷水。
提示:
amount.length == 3
0 <= amount[i] <= 100
解決思路:
設(shè) abc 按序列排
如果c>a+b 返回c
如果c<a+b 返回(a+b-c)/2+c 如果是小數(shù) 要進(jìn)一
為什么c>a+b 返回c 椎镣?
c是最大數(shù)量水杯,并且大于a+b兽赁,那么最佳策略當(dāng)然是A和B分別和C一起灌水状答,最后C剩余的部分再單獨(dú)裝。這種情況的答案就是C刀崖。
為什么c<a+b 返回(a+b-c)/2+c 如果是小數(shù) 要進(jìn)一
如果相差的并沒有這么大惊科,要盡量保證A和B剩余的容積盡可能相同,這樣的話亮钦,我們就可以在裝滿C之后馆截,同時(shí)裝A和B
把C裝滿時(shí)裝入A和B的水也是C,A和B剩余要裝的水量是A+B-C蜂莉,盡量平均地分配在A和B兩個(gè)杯子中蜡娶,所以剩余的時(shí)間就是(A+B-C)/2
然后再加上原本c杯水的時(shí)間
代碼
/**
* @param {number[]} amount
* @return {number}
*/
var fillCups = function(amount) {
function methodSort(a,b){
return a-b;
}
amount=amount.sort(methodSort)
if(amount[0]+amount[1]<amount[2]){
return amount[2]
}else{
return Math.ceil((amount[0]+amount[1]-amount[2])/2)+amount[2]
}
};