九度oj 1437 To Fill or Not to Fill 2012年浙江大学计算机及软件工程研究生机试真题

题目1437:To Fill or Not to Fill

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:1488

解决:345

题目描述:

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.

输入:

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
50 1300 12 2
7.10 0
7.00 600
样例输出:
749.17
The maximum travel distance = 1200.00
来源:
2012年浙江大学计算机及软件工程研究生机试真题
分析:

  1 //贪心算法
  2 //dis=满油箱可以开出的最远距离。
  3 //算法描述:起点A开始,到A+dis范围内:
  4 //1.如果存在点B的s[B].price<=s[A].price,只要满足能行驶到B点即可
  5 //2.如果不存在点B的s[B].price<=s[A].price,则要使车能开到 A+dis范围内除A以外,price最小的点--min_index所指点
  6 //注意:
  7 //1.终点如果在 A+dis范围内,一定可达
  8 //2.注意排序后第一个点的dis可能不为0
  9 //3.离A点最近的B点与A的距离如果>dis,则此趟行驶到不了终点
 10 //4.油箱的情况每次都要关注
 11 //具体见代码:
 12 #include<iostream>
 13 #include<queue>
 14 #include<cstdio>
 15 #include<cstring>
 16 #include<cmath>
 17 #include<algorithm>
 18 using namespace std;
 19 struct station{
 20     double price,dis;
 21 };
 22 station s[505];
 23 bool cmp(station a,station b){
 24     return a.dis<b.dis;
 25 }
 26 int main(){
 27     double cmax,d,davg;
 28     int n;
 29     while(scanf("%lf%lf%lf%d",&cmax,&d,&davg,&n)!=EOF){
 30         double min_price=0;
 31         double max_dis=0;
 32         double cur_tank=0;
 33         int i=0;
 34         for(;i<n;i++){
 35             cin>>s[i].price>>s[i].dis;
 36         }
 37         s[i].dis=d;
 38         s[i].price=0;
 39         sort(s,s+n,cmp);
 40         /*for(i=0;i<=n;i++){
 41             cout<<s[i].dis<<‘ ‘<<s[i].price<<endl;
 42         }*/
 43         if(s[0].dis>0){//2.注意排序后第一个点的dis可能不为0
 44             //cout<<1<<endl;
 45             printf("The maximum travel distance = 0.00\n");
 46             continue;
 47         }
 48         int f=0;
 49         double dis=cmax*davg;
 50         int min_index;
 51         while(s[f].dis<d){
 52             int next=f+1;
 53             min_index=next;
 54             while((s[next].dis-s[f].dis)<=dis){//如果next==n,一定会从break处出去
 55             //跳出循环只有三种情况:
 56             //1.在dis范围内,没有点与f点的距离小于等于dis
 57             //2.在dis范围内,找到price小于f的点(包括next==n)
 58             //3.next!=n,但在dis范围内,没有找到price小于f的点。在dis范围内,有点与f点的距离小于等于dis
 59                 if(s[next].price<s[min_index].price){//记录最小的油价的站点
 60                     min_index=next;
 61                 }
 62                 if(s[next].price<=s[f].price){//在dis范围内,找到price小于f的点
 63                     break;
 64                 }
 65                 next++;
 66             }
 67             if(next==f+1&&(s[next].dis-s[f].dis)>dis){//1.在dis范围内,没有点与f点的距离小于等于dis
 68                 //cout<<1<<endl;
 69                 max_dis+=dis;
 70                 break;
 71             }
 72             else{
 73                 if((s[next].dis-s[f].dis)<=dis){//2.在dis范围内,找到price小于f的点(包括next==n)
 74                     if(s[next].dis-s[f].dis>cur_tank){
 75                         min_price+=(s[next].dis-s[f].dis-cur_tank)*s[f].price;
 76                         cur_tank=0;
 77                         max_dis+=s[next].dis-s[f].dis;
 78                     }
 79                     else{
 80                         cur_tank-=s[next].dis-s[f].dis;
 81                         max_dis+=s[next].dis-s[f].dis;
 82                     }
 83                     f=next;
 84                 }
 85                 else{//3.next!=n,但在dis范围内,没有找到price小于f的点。在dis范围内,有点与f点的距离小于等于dis
 86                     min_price+=(dis-cur_tank)*s[f].price;
 87                     cur_tank=dis-(s[min_index].dis-s[f].dis);
 88                     max_dis+=s[min_index].dis-s[f].dis;
 89                     f=min_index;
 90                 }
 91             }
 92         }
 93         if(s[f].dis==d){
 94             printf("%.2lf\n",min_price/davg);
 95         }
 96         else{
 97             printf("The maximum travel distance = %.2lf\n",max_dis*1.0);//注意输出格式
 98         }
 99     }
100     return 0;
101 }

时间: 2024-10-10 08:50:20

九度oj 1437 To Fill or Not to Fill 2012年浙江大学计算机及软件工程研究生机试真题的相关文章

九度oj 1464 Hello World for U 2012年浙江大学计算机及软件工程研究生机试真题

题目1464:Hello World for U 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3872 解决:1082 题目描述: Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. For example, "helloworld" can be printed as: h    de     ll      rlowo

九度oj 1468 Sharing 2012年浙江大学计算机及软件工程研究生机试真题

题目1468:Sharing 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2687 解决:550 题目描述: To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix.

九度oj 1034 寻找大富翁 2009年浙江大学计算机及软件工程研究生机试真题

题目1034:寻找大富翁 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5323 解决:2123 题目描述:     浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入:     输入包含多组测试用例.    每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.    n和m同时为0时表示输入结束. 输出:     请输出乌镇前m个大富翁的财产数,财产多的

九度oj 1002 Grading 2011年浙江大学计算机及软件工程研究生机试真题

1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int map[15][15]; 9 int main(){ 10 int P,T,G1,G2,G3,GJ; 11 while(cin>>P

九度oj 1001 A+B for Matrices 2011年浙江大学计算机及软件工程研究生机试真题

题目1001:A+B for Matrices 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15235 解决:6172 题目描述: This time, you are supposed to find A+B where A and B are two matrices, and then count the number of zero rows and columns. 输入: The input consists of several test cases, each st

九度oj 1003 A+B 2010年浙江大学计算机及软件工程研究生机试真题

题目1003:A+B 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:12812 解决:5345 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开.现在请计算A+B的结果,并以正常形式输出. 输入: 输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9). 输出: 请计算A+B的结果,并以正常形式输出,每组数据占一行. 样例输入: -234,567,890 123,456,789 1,2

九度oj 1004 Median 2011年浙江大学计算机及软件工程研究生机试真题

题目1004:Median 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:14162 解决:3887 题目描述: Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1={11, 12, 13, 14} is 12, and the median of S2={9, 10, 15, 16, 1

九度oj 1031 xxx定律 2009年浙江大学计算机及软件工程研究生机试真题

题目1031:xxx定律 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5153 解决:3298 题目描述:     对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止.    请计算需要经过几步才能将n变到1,具体可见样例. 输入:     测试包含多个用例,每个用例包含一个整数n,当n为0 时表示输入结束.(1<=n<=10000) 输出:     对于每组测试用例请输出一个数,表示需要经过的步数,每组输出占一行. 样例输

九度oj 1032 ZOJ 2009年浙江大学计算机及软件工程研究生机试真题

题目1032:ZOJ 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4102 解决:2277 题目描述: 读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出. 输入: 题目包含多组用例,每组用例占一行,包含ZOJ三个字符,当输入“E”时表示输入结束.1<=length<=100. 输出: 对于每组输入,请输出一行,表示按照要求处理后的字符串.具体可见样例. 样例输入: ZZOOOJJJ ZZZZOOOOO