首页 > 其他分享 >旅行 题解

旅行 题解

时间:2024-07-30 17:07:47浏览次数:12  
标签:旅行 游玩 题解 ll km leq 城市 define

题目id:20300

题目描述

鱼大大计划环华夏自驾游游玩一圈,在他的计划中,这次旅行将在\(m\)天内完成,预计游玩\(n\)个城市,每个城市游玩\(x\)天,然后赶路开车以均速去到下一个城市,现鱼大大从海洋城市出发,按游玩顺序先后给出每个城市和上一个城市之间的距离(\(km\)),问鱼大大每天至少赶路多少距离(\(km\))才能在\(m\)天内游玩所有城市?

解题思路

由于该题数据范围较大:
\(1\leq n\leq 10^{5}\)
\(1\leq a_i,x,m\leq 10^{15}\)
枚举应该(kěn dìng)会超时,所以我们该题使用时间复杂度为\(O(n\log v)\)的二分查找,其中\(v\)为每天最多赶的路程(既\(10^{15}km\)),多出来的\(n\)为每次\(check\)函数的时间复杂度。
由于求的是最小值,我们需要用如下二分查找模板:

while(l<r)
{
    ll mid=(l+r)/2;
    if(check(mid))r=mid;
    else l=mid+1;
}

那我们如何编写\(check\)函数呢?
因为我们二分的是每天最少的赶路路程(\(km\)),所以我们遍历一遍路程数组,求出对于第\(i-1\)个城市到第\(i\)个城市按照当前速度\(v\ km/天\)需要\(x_i\)天赶完,最后的总天数即为
\( \begin{equation*} t=(\sum_{i=1}^nx_i)+(\sum_{i=1}^ny_i) \end{equation*} \)
其中\(y_i\)为每个城市的游玩天数。
另外,由于每天赶路的速度是整数,所以\(x_i\)需要向上取整。
综上所述,可得\(check\)函数如下:

bool check(ll mid)
{
    ll cnt=0;
    for(ll i=1;i<=n;++i)
        cnt+=(ll)(ceil((double)(a[i])/mid));
    return cnt<=m;
}

其中\(m\)已提前减去游玩天数。

AC Code

#include<bits/stdc++.h>
#define N 1000007
#define INF 1e18
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define IOS ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
ll n,m,l,r=1e15,a[N];
bool check(ll mid)
{
    ll cnt=0;
    for(ll i=1;i<=n;++i)cnt+=(ll)(ceil((double)(a[i])/mid));
    return cnt<=m;
}
int main()
{
    IOS,cin>>n>>m;
    for(ll i=1,day;i<=n;++i)cin>>a[i]>>day,m-=day;
    while(l<r)
    {
        ll mid=(l+r)/2;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    if(l==1e15)cout<<-1;
    else cout<<l;
    return 0;
}

标签:旅行,游玩,题解,ll,km,leq,城市,define
From: https://www.cnblogs.com/988176-/p/18332907

相关文章

  • 质数差列 题解
    题目id:20315题目描述驰骋宇宙的鱼大大找到了一个古遗迹,稍作研究后发现这是一个来着远古的质数星球文明遗迹,这个文明的特点是所有事物都和质数息息相关。于是,鱼大大赶紧列出了一堆的质数,以方便自己的研究。这天鱼大大找到了质数星球文明的一个遗迹仓库大门,正准备破解密码的同时......
  • [POI2008] POC-Trains 题解
    前言题目链接:洛谷。时间复杂度和输入同阶的做法。题意简述有\(n\)(\(n\leq10^3\))个长\(m\)的字符串,\(q\)(\(q\leq10^5\))次操作,交换两个字符串的两个字符。问每个字符串在所有时刻,最多有几个和它相等。题目分析套路做法看到字符串相等,想到使用哈希。但是要支持修改,怎么......
  • 题解:[ABC363D] Palindromic Number
    提示特定位数的回文数数量是可以快速计算出来的,对于特定的位数\(n\),第一位由于不能有前导\(0\),共有\(9\)种选择,而从第\(2\)位到第\(\frac{n+1}{2}\)位都有\(10\)种选择(一个回文数完全由它的前半部分确定)。所以\(n\)位数中共有\(S(n)=9*10^\frac{n-1}{2}......
  • P3811 【模板】模意义下的乘法逆元 题解
    【模板】模意义下的乘法逆元题目背景这是一道模板题题目描述给定n,pn,pn,p求......
  • 题解:Codeforces Round 962 (Div. 3) D
    D.Funtimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputCountingisFun!—satyam343Giventwointegers\(n\)and\(x\),findthenumberoftriplets(\(a,b,c\))ofpositiveintegerss......
  • [USACO1.5] 八皇后 Checker Challenge 题解
    [USACO1.5]八皇后CheckerChallenge题目描述一个如下的\(6\times6\)的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列\(2\4\6\1\3\5\)来描述,第\(i\)个数字表示在......
  • 基于java+ssm+jsp旅行社管理系统的设计与实现录像(源码+lw+部署文档+讲解等)
    前言......
  • P1081 [NOIP2012 提高组] 开车旅行
    思路:首先令\(nxt1_i\)表示右侧最近的城市距离(\(id1_i\)为编号),令\(nxt2_i\)表示右侧第二近的城市编号(\(id2_i\)为编号);可以使用set找出离这个城市最近的\(4\)个城市(前面两个,后面两个)。定义:\(f_{i,j}\)表示从\(i\)点出发走\(2^j\)轮最后到达的位置。\(dp1_{i,......
  • 牛的旅行
    //牛的旅行.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<cmath>#include<algorithm>#include<cstring>usingnamespacestd;/*https://www.acwing.com/problem/content/1127/农民John的农场里有很多牧区,有的路径......
  • 题解:P10815 【模板】快速读入
    闲着没事儿水篇tj题目大意题目大意极其粗暴,记得\(10^8\times10^8=10^{16}>2^{31}-1\)会爆int,开longlong就好。于是这个题就变成了一个读入输出优化模板题。这不又回去了。另外,输入输出常数优化也很常用,抢最优解和骗分时都可以用上。1cin/cout版本操作ios::......