C - Convoy Kattis - convoy(二分列舉時間點)
阿新 • • 發佈:2021-01-28
技術標籤:二分
題目: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;
}