*【Journey】
题目描述:小 Y 开始了一段旅途。
从起点到终点一共分为 n 段路,相邻的两段路间设有休息站。
小 Y 计划用最多 m 天走完全程,除第 m 天外,每一天小 Y 都必须在休息站过夜。所以,一段路必须在同一天走完。小 Y 的体力有限,他希望走的路最多的一天中走的路尽可能少,请求出这个最小值。
输入
第一行两个正整数 n 和 m,分别路段数和天数。
从第二行开始,之后的 n行,第i 行为一个正整数 ai ,表示第 i段路的长度。
输出
一行一个正整数,表示小 Y 走的路最多的一天的路程最小值。
样例输入
6 3
2
2
3
1
4
1
样例输出
5
提示
对于 30% 的数据,n,m≤10
对于 60% 的数据,n≤900,m≤400
对于 100% 的数据,1≤n≤100000 ,1≤m≤n ,1≤ai≤10^12
这道题很简单就一个 二分题,只需二分m天中路程最远的那一天的路程即可即可
具体代码如下实现(c++)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<vector>
#include<stack>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ull unsigned long long
#define re register
using namespace std;
ull n;
ull m;
ull a[100001];
inline bool fen(ull x){
ull k=0;
ull sum=0;
for(re ull i=1;i<=n;i++){
if(a[i]>x)return false;
k+=a[i];
if(k>x){
k=a[i];
sum++;
}
}
if(sum>=m)return false;/*为什么要有等于?因为sum从0开始,sum加了m次,实则走了m+1天;*/
return true;/*如果最大路程为x时所需天数小于m,则需要将x减小/////注意是减小!!!*/
}
inline void init(){
scanf("%lld%lld",&n,&m);
for(re ull i=1;i<=n;i++)
scanf("%lld",&a[i]);
ull l=0;
ull r=100000000000000;
ull mid;
while(l+1<r){
mid=(l+r)/2;
if(fen(mid))r=mid;
else l=mid;
}
if(fen(l))cout<<l;
else cout<<r;
}
int main(){
init();
return 0;
}
这是二分当中算简单的了,如果觉得二分很有趣的话,可以在落谷上找二分题来做
*