CSP-J T2 WA 求调
  • 板块学术版
  • 楼主qinghaipeng
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/10/22 06:55
  • 上次更新2023/11/2 12:02:55
查看原帖
CSP-J T2 WA 求调
690333
qinghaipeng楼主2023/10/22 06:55

二分钱数量,钱越多能买的油就越多(满足单调性)

#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
*/

貌似样例也过不了

2023/10/22 06:55
加载中...