Bus 题解

题目传送门

题目大意

一辆汽车从 \(0\)\(a\) 往返 \(k \div 2\) 次(也就是去算一次,回算一次);原来有 \(b\) 升油,每行驶一单位距离消耗一升油,在 \(f\) 有加油站(可以加满油或者不加油);问要加多少次油;若到达不了 \(a\) 处,输出 \(-1\)

解题思路

要先判断是否能用 \(b\) 升油走到加油站。

不能就永远到不了,直接结束了。

如果能:

以加油站为分点,将这段路分为两段;

第一段:

去:如果能不加油到终点再走回来,就不加油;否则就加油。

回:同理。

注意每次都要判断到加油站的距离不能小于零。

代码如下:

int first(int a,int b,int f,int k) {
	for(int i=1; i<=k-1; i++) {
		if(i%2==1) {    
			if(sum>=2*(a-f))sum-=2*(a-f);
			else {
				sum=b-2*(a-f);
				ans++;
				if(sum<0) {
					cout<<"-1";
					exit(0);
				}
			}
		} 
		else {
			if(sum>=2*f)sum-=2*f;
			else {
				sum=b-2*f;
				ans++;
				if(sum<0) {
					cout<<"-1";
					exit(0);
				}
			}
		}
	}
}

第二段:

与第一段同理。

注意每次也都要判断到加油站的距离不能小于零。

代码如下:

int second(int a,int b,int f,int k) {
	if(k%2==1) {
		if(sum<(a-f)) {
			sum=b-(a-f);
			ans++;
			if(sum<0) {
				cout<<"-1";
				exit(0);
			}
		}
	} 
	else {
		if(sum<f) {
			sum=b-f;
			ans++;
			if(sum<0) {
				cout<<"-1";
				exit(0);
			}
		}
	}
}

注意一个地方:

在这里
return 0 就是退出这个函数,而不是返回这个程序,用 exit(0) 相当于在 mainreturn 0(感谢 kuailedetongnian 的提醒)。

完整 AC 代码

posted @ 2022-12-25 14:51  Ggsddu_zzy  阅读(15)  评论(0编辑  收藏  举报