生活随笔
收集整理的這篇文章主要介紹了
LintCode 1753. 写作业(二分查找)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
n個人,他們每個人需要獨立做 m 份作業。
第 i 份作業需要花費 cost[i] 的時間。由于每個人的空閑時間不同,第 i 個人有 val[i] 的時間,這代表他做作業的總時間不會超過 val[i]。每個人都按照順序,從1號作業開始,然后做2號,3號… 現在,你需要計算出他們最多花了多少的時間。
樣例
1:
給定`cost
=[1,2,3,5]`,`val
=[6,10,4]`,返回`
15`。
輸入
:
[1,2,3,5]
[6,10,4]
輸出
15解釋
:
第一個人可以完成
1號作業,
2號作業,
3號作業,
1+2+3<=6。
第二個人可以完成
1號作業,
2號作業,
3號作業,無法完成
4號作業,
1+2+3<=10,
1+2+3+5>10。
第三個人可以完成
1號作業,
2號作業,無法完成
3號作業,
1+2<=4,
1+2+3>4。
1+2+3+1+2+3+1+2=15,返回
15。樣例
2:
給定 `cost
=[3,7,3,2,5]`
,`val
=[10,20,12,8,17,25]`
,返回`
78`
.
輸入
:
[3,7,3,2,5]
[10,20,12,8,17,25]
輸出
:
78解釋
:
第一個人可以完成
1號作業,
2號作業
, 3 + 7<=10.
第二個人可以完成
1號作業,
2號作業,
3號作業,
4號作業和
5號作業
, 3+7+3+2+5<=20
第三個人可以完成
1號作業,
2號作業,無法完成三號作業
, 3+7<=12,3+7+3>12.
第四個人可以完成
1號作業,無法完成
2號作業
, 3<=8,7+3>8.
第五個人可以完成
1號作業,
2號作業,
3號作業,
4號作業,無法完成
5號作業
,3+7+3+2<=17,3+7+3+2+5>17.
第六個人可以完成
1號作業,
2號作業,
3號作業,
4號作業和
5號作業
, 3+7+3+2+5<=25
3+7+3+7+3+2+5+3+7+3+3+7+3+2+3+7+3+2+5=78, 返回
78.注意事項
1<=n
<=100000
1<=m
<=100000
1<=val
[i
]<=100000
1<=cost
[i
]<=100000
2. 解題
- 先將做至第 i 作業的前綴和求出來
- 然后二分查找 小于等于 val 的最后一個數
class Solution {
public:long long doingHomework(vector
<int> &cost
, vector
<int> &val
) {long long sum
= 0;int i
, j
;for(i
= 0; i
< cost
.size(); ++i
){sum
+= cost
[i
];cost
[i
] = sum
;}sort(val
.begin(),val
.end());sum
= 0;for(i
= 0; i
< val
.size(); ++i
){if(val
[i
] > cost
.back()){sum
+= cost
.back();continue;}j
= bs(cost
,val
[i
]);if(j
!= -1)sum
+= cost
[j
];}return sum
;}int bs(vector
<int>& cost
, int v
){int l
= 0, r
= cost
.size()-1, mid
;while(l
<= r
){mid
= l
+((r
-l
)>>1);if(cost
[mid
] > v
){r
= mid
-1;}else{if(mid
==cost
.size()-1 || cost
[mid
+1] > v
)return mid
;elsel
= mid
+1;}}return -1;}
};
100% 數據通過測試
總耗時 201 ms
您的提交打敗了 39.52% 的提交!
總結
以上是生活随笔為你收集整理的LintCode 1753. 写作业(二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。