1. 程式人生 > 其它 >C - Convoy Kattis - convoy(二分列舉時間點)

C - Convoy Kattis - convoy(二分列舉時間點)

技術標籤:二分

題目:https://vjudge.z180.cn/problem/Kattis-convoy

題意: n個人在A地方,現在他們要全部去往B地方,總共有K輛車,然後給出每個人開車從A到B(也是B=A)需要的時間,每輛車只能拉五人(包括司機),求所有人全部從A地方到達B地方所需要的最少時間(不需要考慮最後有多少輛車在A地方或者B地方)。

題解:直接求不太好求,需要考慮和分析的太多,那麼如果直接給個時間,判斷在這個時間內能不能讓n個人全部去B這個地方卻是比較容易的,,那麼答案就出來了,二分列舉時間點,然後判斷這個時間滿足不滿足。

程式碼:

#include <bits/stdc++.h>
using namespace std; typedef long long ll; int n,k; int a[20002]; int check(ll mid) { ll s=0; int minn=min(n,k); //取倆個最小 for(int i=1; i<=minn; i++) { ll t=mid; //t是ll,所以s也得是ll,不然可能超int if(a[i]<=mid)s+=5,t-=a[i]; //首先判斷a[i]能跑一趟嗎,能就先讓 s+=(t/(a[i]*2))*4;//它把送去五人那一趟跑了(包括自己不回來),然後回來再拉人就是每一趟送4個人
if(s>=n)return 1;//如果比n大了就返回1就行 } return 0; } int main() { scanf("%d%d",&n,&k); for(int i=1; i<=n; i++)scanf("%d",&a[i]); sort(a+1,a+1+n); ll l=1,r=1e10; //最大是1e10 while(l<r) //二分模板 { ll mid=(l+r)/2; if(check(mid)
)r=mid; else l=mid+1; } printf("%lld\n",l); return 0; }