KY155 To Fill or Not to Fill

本文介绍了一个使用贪心策略解决的编程模拟题,涉及C++代码实现,目标是计算在给定条件下,如何在加油站间选择路径以最大化行驶距离。通过比较和优化加油策略,求解最大行驶距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心,很复杂的一个模拟题
ti

#include<bits/stdc++.h>

using namespace std;

#define db double

struct ST{
	db p, d;
}st[510];

int D, n;
db cmax, dvag;

bool cmp(ST a, ST b){
	return a.d < b.d;
}

int main()
{
	while(cin>>cmax>>D>>dvag>>n){
		memset(st, 0, sizeof st);
		db ans = 0;
		bool f = 0;
		db cur = 0;
		db maxgo = cmax * dvag;
		
		for(int i = 0; i < n; i ++ ) cin>>st[i].p>>st[i].d;
		
		sort(st, st + n, cmp);
		
		if(st[0].d != 0){
			cout<<"The maximum travel distance = 0.00"<<endl;
			continue;
		}
	
		for(int i = 0; i < n; i ++ ){
			if(i == n - 1){
				db lis = D - st[i].d;  //距离终点的距离 
				if(maxgo >= lis){  //可以到达 
					if(cur < lis / dvag){
						ans += ((lis / dvag) - cur) * st[i].p;
					}
				}
				else{
					printf("The maximum travel distance = %.2f", maxgo + st[i].d); 
					f = 1;
				}
				break;
			}
			//如果不是最后一个加油站
			if(st[i + 1].d - st[i].d > maxgo){
				printf("The maximum travel distance = %.2f\n", maxgo + st[i].d);
				f = 1;
				break;
			}
			int idx = i;
			for(int j = i + 1; j < n; j ++ ){
				if(st[j].d - st[i].d <= maxgo ){  //当前油能到达下一个更便宜的加油站 
					if(st[j].p < st[i].p){
						idx = j;
						break; 
					}
				}
				else break;
			}
			if(idx == i){  //如果当前就是应该加油的油站 
				if((D - st[i].d) <= maxgo){
					if(cur < (D - st[i].d) / dvag){
						ans += ((D - st[i].d) / dvag - cur) * st[i].p;
					}
					break;
				} 
				db uu = cmax - cur;
				ans += uu * st[i].p;
				cur = cmax - (st[i + 1].d - st[i].d) / dvag;
			}
			else{
				db diu = (st[idx].d - st[i].d) / dvag;
				if(cur >= diu){
					cur -= diu;
				}			
				else{
					db ii = diu - cur;
					ans += ii * st[i].p;
					cur = 0;
				}	
				i += idx - i - 1;
			}
		}
		if(!f) printf("%.2f\n", ans);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值