二分钱数量,钱越多能买的油就越多(满足单调性)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define int long long
#define F(i,j,n) for(register int i=j;i<=n;++i)
#define bug puts("liupei")
#define rt return
using namespace std;
const bool debug=0;
const int N=1e5+50;
int n,d,v[N],a[N];
inline bool check(int x){//判断 x 的钱够不够去往 n
register int wz=0,id=1;
//wz 表示在哪个位置
//1 位置车的油箱是空
//id 是目前到了的车站
while(wz<v[n]&&x>0){
while(wz<v[id+1]&&x>=a[id]){//往下一个开车
x-=a[id];
wz+=d;
}
if(wz<v[id+1]){
rt false;
}
++id;
if(debug){
//printf("wz:%lld id:%lld x:%lld\n",wz,id,x);
}
}
rt (wz>=v[n]);
}
signed main(){
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
register int mx=1,l,r,mid;
scanf("%lld%lld",&n,&d);//每升油可以让车前进 d 公里
F(i,1,n-1)scanf("%lld",&v[i+1]),v[i+1]+=v[i];//vi 表示 i+1 车站所在的位置(所以前缀和一下)
//样例中 v[1]=0 v[2]=10 v[3]=20 v[4]=30 v[5]=40
F(i,1,n)scanf("%lld",&a[i]),mx=max(mx,a[i]);
int test=1;
if(debug){
//F(i,1,n)printf("v[%lld]=%lld ",i,v[i]);
//puts("");
//printf("check(%lld)=%d\n",test,check(test));
}
l=0,r=mx+1;
while((l+1)<r){
mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid;
}
printf("%lld",r);//可行域的指针是 r
rt 0;
}
/*
in
5 4
10 10 10 10
9 8 9 6 5
out
79
*/
貌似样例也过不了