75求助
查看原帖
75求助
1017407
Wuenhao楼主2025/6/28 08:52
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
const int N = 1e1 + 10;
int n = 0;
//  给定两个城市之间的距离 D1
// 汽车油箱的容量 C(以升为单位)
// 每升汽油能行驶的距离 D2
// 出发点每升汽油价格P和沿途油站数 N(N 可以为零)
double d1 = 0,c = 0,d2 = 0;
double p = 0,maxx = 0,rem = 0;

struct Node
{
	double d;
	double p;
}nums[N];

int cmp(Node a,Node b)
{
	return a.d < b.d;
}

double fun()
{
	double rdis = 0,res = 0;
	int now = 0,tp = -1,midx = 0;
	Node minn;
	minn.p = 1e3 + 10;

	//按照距离大小排序
	sort(nums,nums + n + 2,cmp);
 
	while(rdis != d1)
	{
		// 先判断有没有比当前加油站便宜的加油站
		// 如果没有,看可不可以直接到终点
		// 或者有没有相对便宜的加油站
		for(int i = now + 1;i <= n + 1 && (nums[i].d - nums[now].d) <= maxx;i++)
		{
			//找比当前加油站便宜的加油站
			if(nums[i].p < nums[now].p)
			{
				tp = i;
				break;
			}

			//找相对便宜的
			if(minn.p > nums[i].p)
			{
				minn.p = nums[i].p;
				minn.d = nums[i].d;
				midx = i;
			}
		}

		//没有比这个当前加油站便宜的加油站
		if(tp == now)
		{
			//可以直接到终点
			if((nums[n + 1].d - nums[now].d - rem) <= maxx)
			{
				tp = n + 1;
			}
			//无法直接到终点,到相对便宜的
			else
			{
				tp = midx;
				//加满到相对便宜的加油站
				rem += (maxx - (nums[tp].d - nums[now].d - rem * d2)) / d2;
			}
		}

		rdis = nums[tp].d;
		if(rdis - nums[now].d <= rem * d2)
		{
			rem = 0;
			now = tp;
			continue;
		}
		res += (rdis - nums[now].d - rem * d2) / d2 * nums[now].p;
		rem = 0;
		now = tp;
	}

	return res;
}

int main()
{
	double res = 0,flg = 0;
	cin >> d1 >> c >> d2 >> p >> n;
	maxx = c * d2;

	nums[0].d = 0;
	nums[0].p = p;
	for(int i = 1;i <= n;i++)
	{
		cin >> nums[i].d;
		cin >> nums[i].p;
		if((nums[i].d - nums[i - 1].d) > maxx)
		{
			flg = 1;
		}
	}
	if(d1 - nums[n].d > maxx)
	{
		flg = 1;
	}

	//在输入时就判断可不可以到达下一个加油站
	//不用在处理的时候判断,更快
	if(flg == 1)
	{
		cout << "No Solution" << endl;
		return 0;
	}
	nums[n + 1].d = d1;
	nums[n + 1].p = 0;

	res = fun();

	//保留小数点后两位
	cout << fixed << setprecision(2) << res << endl;
	return 0;
}

一个特别丑陋的代码,玄关

2025/6/28 08:52
加载中...