1033. To Fill or Not to Fill (25)

加油事件的贪心选择模拟

#include<iostream>
#include<vector>
#include<algorithm>

typedef struct Station
{
	double dis;
	double price;
	bool operator<(const Station& other) const
	{
		return dis < other.dis;
	}
}Station;

double unit_gas;
int FindNeatestCheaperStation(int i, double gas, std::vector<Station>& s)
{
	int num = s.size();
	int min_index = i;
	for(int j = i+1; j < num && s[j].dis-s[i].dis <= gas*unit_gas; ++j)
	{
		if(s[j].price < s[min_index].price)
		{
			min_index = j;
			break;
		}
	}
	return min_index;
}

int GetFastestStation(int i, double gas, std::vector<Station>& s)
{
	int num = s.size();
	int max_index = i;
	for(int j = i+1; j < num && s[j].dis-s[i].dis <= gas*unit_gas; ++j)
	{
		max_index = j;
	}
	return max_index;
}

int main()
{
	double max_gas, total_dis;
	int n;
	while(scanf("%lf%lf%lf%d",&max_gas,&total_dis,&unit_gas,&n)!=EOF)
	{
		std::vector<Station> sVec(n);
		for(int i = 0; i < n; ++i)
			scanf("%lf %lf",&sVec[i].price,&sVec[i].dis);
		//sort station by distance
		std::sort(sVec.begin(), sVec.end());
		Station vir;
		vir.dis = total_dis;//add destination as a virtual station in the end
		sVec.push_back(vir);
		//algorithm core
		if(n==0 || sVec[0].dis > 0)//special case
			printf("The maximum travel distance = 0.00\n");
		else//greedy now
		{
			double remain_gas = 0.0;
			double cur_money = 0.0;
			int i;
			for(i = 0; i < n; )
			{
				int index;
				//1. using remain gas find nearest cheaper station
				index = FindNeatestCheaperStation(i, remain_gas, sVec);
				if(index != i)//find a station else
				{//get there
					remain_gas -= (sVec[index].dis-sVec[i].dis)/unit_gas;
					i = index;
					continue;
				}
				//2. using max_gas find nearest cheaper station
				index = FindNeatestCheaperStation(i, max_gas, sVec);
				if(index != i)//find a station else
				{//get there
					cur_money += ((sVec[index].dis-sVec[i].dis)/unit_gas-remain_gas)*sVec[i].price;
					remain_gas = 0.0;
					i = index;
					continue;
				}
				//3. get the max_gas and go as far as possible
				index = GetFastestStation(i, max_gas, sVec);
				if(index != i)
				{//can get some where
					cur_money += (max_gas-remain_gas)*sVec[i].price;
					remain_gas = max_gas-(sVec[index].dis-sVec[i].dis)/unit_gas;
					i = index;
					continue;
				}
				else 
				{
					printf("The maximum travel distance = %.2lf\n", sVec[i].dis+max_gas*unit_gas);
					break;
				}
			}//end of greedy
			if(i == n) printf("%.2lf\n", cur_money);
		}
		
	}
	return 0; 
}


 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值