二分典题--【Journey】

本文通过一道关于旅行规划的问题,介绍了二分查找算法的具体应用。小Y需要在限制的天数内完成旅程,且每天行走的路程需尽可能均匀。文章详细解析了如何使用二分查找确定每天行走的最大路程,以实现最优规划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*【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;
}

这是二分当中算简单的了,如果觉得二分很有趣的话,可以在落谷上找二分题来做
*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值