1033 To Fill or Not to Fill

With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different price. You are asked to carefully design the cheapest route to go.

Input Specification:

Each input file contains one test case. For each case, the first line contains 4 positive numbers: C​max​​ (≤ 100), the maximum capacity of the tank; D (≤30000), the distance between Hangzhou and the destination city; D​avg​​ (≤20), the average distance per unit gas that the car can run; and N (≤ 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: P​i​​, the unit gas price, and D​i​​ (≤D), the distance between this station and Hangzhou, for i=1,⋯,N. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print The maximum travel distance = X where X is the maximum possible distance the car can run, accurate up to 2 decimal places.

Sample Input 1:

50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300

Sample Output 1:

749.17

Sample Input 2:

50 1300 12 2
7.10 0
7.00 600

Sample Output 2:

The maximum travel distance = 1200.00

待解决,思考中

这个题目我想了好几天,知道是使用贪心算法但是对于严谨性一直欠考虑。

以下是《算法笔记》AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 510;
const int INF = 1000000000;

struct station{
	double price,dis;//价格,与起点的距离
}st[maxn];

bool cmp(station a, station b)
{
	return a.dis<b.dis;//从小到大排序
}

int main()
{
	int n;
	double Cmax,D,Davg;
	scanf("%lf%lf%lf%d",&Cmax,&D,&Davg,&n);
	for(int i=0;i<n;i++)
	{
		scanf("%lf%lf",&st[i].price,&st[i].dis);
	}
	st[n].price = 0;//终点
	st[n].dis = D;//终点距离
	sort(st,st+n,cmp);//加油站从小到大排序
	if(st[0].dis!=0)//第一个加油站不为0,无法前进
	{
		printf("The maximum travel distance = 0.00\n");
	 }
	 else{
	 	int now = 0;//当前所处的加油站编号
		 double ans =0, nowTank=0, MAX = Cmax*Davg;
		 while(now<n) {
		 	//每次循环选出下一个需要到达的加油站
			 int k=-1;
			 double priceMin=INF;
			 for(int i=now+1;i<=n&&st[i].dis-st[now].dis<=MAX;i++)
			 {
			 	if(st[i].price<priceMin)
			 	{
			 		priceMin = st[i].price;
			 		k = i;
			 		if(priceMin<st[now].price)
			 		{
			 			break;
					 }
				 }
			  } 

		if(k == -1)	break;
		double need = (st[k].dis-st[now].dis)/Davg;
		if(priceMin < st[now].price)
		{
			if(nowTank<need)
			{
				ans+=(need-nowTank)*st[now].price;
				nowTank = 0;
			}
			else{
				nowTank -= need;
			}
		}
		else{
			ans+=(Cmax-nowTank)*st[now].price;
			nowTank = Cmax - need;
		}
		now= k;
		}
		if(now == n)
		{
			printf("%.2f\n",ans);
		}
		else{
			printf("The maximum travel distance = %.2f\n",st[now].dis+MAX);
		}
		}
		return 0;
}

PAT甲级——1033 To Fill or Not to Fill的更多相关文章

  1. PAT甲级1033. To Fill or Not to Fill

    PAT甲级1033. To Fill or Not to Fill 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...

  2. PAT 甲级 1033 To Fill or Not to Fill (25 分)(贪心,误以为动态规划,忽视了油量问题)*

    1033 To Fill or Not to Fill (25 分)   With highways available, driving a car from Hangzhou to any oth ...

  3. 【贪心】PAT 1033. To Fill or Not to Fill (25)

    1033. To Fill or Not to Fill (25) 时间限制 10 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 ZHANG, Gu ...

  4. PAT 1033 To Fill or Not to Fill[dp]

    1033 To Fill or Not to Fill(25 分) With highways available, driving a car from Hangzhou to any other ...

  5. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  6. 【转载】【PAT】PAT甲级题型分类整理

    最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...

  7. PAT 甲级真题题解(1-62)

    准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format  模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...

  8. 1033 To Fill or Not to Fill

    PAT A 1033 To Fill or Not to Fill With highways available, driving a car from Hangzhou to any other ...

  9. PAT甲级目录

    树(23) 备注 1004 Counting Leaves   1020 Tree Traversals   1043 Is It a Binary Search Tree 判断BST,BST的性质 ...

随机推荐

  1. POJ 1019:Number Sequence 二分查找

    Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36013   Accepted: 10409 ...

  2. POJ 1006:Biorhythms 中国剩余定理

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 121194   Accepted: 38157 Des ...

  3. python 进程和线程(2)

    这篇博客是按照博客<进程和线程(1)>中内容用futures改写  with futures.ProcessPoolExecutor() as executor:可以两篇博客对照看. 2改 ...

  4. k8认证机制

    参考下面博文 http://www.mamicode.com/info-detail-2270627.html 需要补充: k8s的的认证机制场景使用 客户端证书认证         采用双向证书进行 ...

  5. VS程序不显示控制台

    之所以会有这样的想法是因为,有时候我会用到一些库,这些库在使用的时候会在控制台输出一些信息,虽然这是无可厚非的事情,但是,如果我写了一个界面,这个时候当然是希望要显示什么就显示在界面上,或者就不要显示 ...

  6. (转)Java并发编程:阻塞队列

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  7. SoapUI substring

  8. 【转帖】虚拟化Pod性能比裸机还要好,原因竟然是这样!

    虚拟化Pod性能比裸机还要好,原因竟然是这样! http://www.itpub.net/2020/02/27/5340/ 其实感觉 linux也可以做到 NUMA的节点优化 其实 直接在 ESXi上 ...

  9. [LuoguP3978](https://www.luogu.org/problem/P3978) BZOJ4001概率论

    BZOJ 4001 概率论 设\(f_i\)表示i个点的二叉树方案数 立刻有\(f_n = \sum_{i=0}^{n-1} f_i f_{n-i-1}\) 设\(F(x)为序列f的生成函数,有F(x ...

  10. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...