PAT 1004 To Fill or Not to Fill (25)
2015-06-06 09:09
513 查看
题目描述
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.
输入描述:
Each input file contains one test case. For each case, the first line contains 4 positive numbers: Cmax (<= 100), the maximum capacity of the tank; D (<=30000), the distance between Hangzhou and the destination city; Davg (<=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: Pi, the unit gas price, and Di (<=D), the distance between this station and Hangzhou, for i=1,...N. All the numbers in a line are separated by a space.
输出描述:
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.
输入例子:
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
输出例子:
749.17
#include <iostream> #include <cstdio> #include <algorithm> #include <climits> using namespace std; typedef struct Node { double price; double distance; }Node; bool cmp(const Node& lhs, const Node& rhs) { return lhs.distance<rhs.distance; } int main() { double Cm,D,cur,cost,minCost,maxDistance; int Da,N; int i,j,k,l,ans; while(cin>>Cm>>D>>Da>>N) { maxDistance=Cm*Da; Node *node=new Node[N+1]; for(i=0;i<N;i++) cin>>node[i].price>>node[i].distance; sort(node,node+N,cmp); node .price=0; node .distance=D; ans=cur=cost=0; for(i=0;i<N-1;i++) { if((node[i+1].distance-node[i].distance)>maxDistance) break; } if(i<N-1) { printf("The maximum travel distance = %.2lf\n",node[i].distance+maxDistance); } else { for(i=0;i<N;) { //后面如果有比当前更便宜的汽油,现在先少弄点,够到那个地方就OK l=i; minCost=node[i].price; for(j=i+1;j<=N && (node[i].distance+maxDistance>=node[j].distance);j++) { if(minCost>node[j].price) { l=j; break; } } if(l!=i) { cost=cost+((node[l].distance-node[i].distance)/Da-cur)*node[i].price; cur=0; i=l; continue; } //如果找不到更便宜的加油站,找出相对最便宜的加油站,并且在当前加油站加满油 l=i; minCost=1e18; for(j=i+1;j<=N && (node[i].distance+maxDistance>=node[j].distance);j++) { if(minCost>node[j].price) { minCost=node[j].price; l=j; } } cost=cost+(Cm-cur)*node[i].price; cur=Cm-(node[l].distance-node[i].distance)/Da; i=l; } printf("%.2lf",cost); } /* for(i=0;i<N;i++) cout<<node[i].price<<" "<<node[i].distance<<endl; */ } return 0; }
贴个图
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++中拷贝构造函数的应用详解
- C++中引用(&)的用法与应用实例分析
- C++使用CriticalSection实现线程同步实例
- C++智能指针实例详解
- 解析C++ 浮点数的格式化输出