UVa907

題敘

http://domen111.github.io/UVa-Easy-Viewer/?907
在一趟路途中總共過了 $k$ 天晚上,也就是 $k+1$ 天
在 $n$ 個暫停點之間加上起點與終點共包含 $n+1$ 條路連接兩兩暫停點,每個路徑都有一個距離
求在經過 $k$ 天晚上的情況下,一天行走距離的最小值為多少

想法

如果說一日行走距離 $m$ 可以在 $k+1$ 天走完,那麼距離 $m+1$ 也一定可以
所以觀察到行走距離具有單調性
枚舉一天行走的距離,如果所需的時間超過 $k$ ,就將枚舉的上界調整,否則調整下界

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//By Koios1143
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
int n,k,Min=0,Max=0,arr[605];
int search(int l,int r,int p){
while(l<r){
int mid=(l+r)>>1;
int dis=arr[0],day=0;
for(int i=1 ; i<=n ; i++){
if(dis+arr[i]>mid){
day++;
dis=arr[i];
}
else dis+=arr[i];
}
if(dis<=mid) day++;
if(day>p) l=mid+1;
else r=mid;
}
return l;
}
int main(){
while(cin>>n>>k){
Min=Max=0;
for(int i=0 ; i<=n ; i++){
cin>>arr[i];
Min=max(Min,arr[i]);
Max+=arr[i];
}
cout<<search(Min,Max,k+1)<<"\n";
}
return 0;
}

複雜度分析

二分搜尋的上界與下界的差值約若為 $\sum arr[i]$
複雜度約為 $O(log_2 \sum arr[i])$