九度OJ #1437 To Fill or Not to Fil
来源:互联网 发布:银鼎天贵金属行情软件 编辑:程序博客网 时间:2024/06/11 16:27
- 题目描述:
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 86.00 12507.00 6007.00 1507.10 07.20 2007.50 4007.30 10006.85 30050 1300 12 27.10 07.00 600
- 样例输出:
749.17The maximum travel distance = 1200.00
- 来源:
2012年浙江大学计算机及软件工程研究生机试真题
这道题确实挺难的,花了好久的时间,然后自己考虑不全面,最后参考别人的代码才搞定。
就不敢写原创了。。。
http://ziliao1.com/Article/Show/73A96AF77079A6C32C4AA82604FCF691
典型的贪心法。思想就是考虑下一次在何站点加油(从而决定了在本站点需要加多少油)。考虑这样几种情况:
1、到达下一站点所需油量 > 油箱最大容量:则下一站点不可达。做法是把油箱加满,尽可能跑,然后break掉。
2、下一站点可达,且油价比本站点便宜:则应尽早“换用”更便宜的油。做法是本站加够即可,使得刚好能到达下一站。
3、下一站点可达,但油价比本站点贵:此处第一次做错了,不应该在本站把油箱加满,而应该继续寻找满油的条件下可达的下一个比本站便宜的站点。若找到,则加够即可(所以情况2可以并到这里);若未找到,则在本站将油箱加满。
#include <algorithm> #include <iomanip>#include <iostream>using namespace std;struct station{float price;float dist;};station st[501];float cmax, d, davg;int n;bool cmp(station a, station b){return a.dist < b.dist;}// 寻找下一个可达的便宜站点int nextCheaper(int now){for(int i = now; i < n; i++){if(st[i].dist - st[now].dist > cmax * davg) break;if(st[i].price < st[now].price)return i;}return -1;}int main(){while(cin >> cmax){cin >> d >> davg >> n;for(int i = 0; i < n; i++)cin >> st[i].price >> st[i].dist;st[n].price = -1; st[n].dist = d;n = n + 1;sort(st, st + n, cmp);int nowst = 0;float nowgas = 0;float cost = 0;while(nowst < n - 1){if(nowst == 0 && st[0].dist != 0){st[nowst].dist = 0; break;}float needgas = (st[nowst + 1].dist - st[nowst].dist) / davg;if(needgas > cmax){float addgas = cmax - nowgas;cost += addgas * st[nowst].price;st[nowst].dist += cmax * davg;break;}int nextc = nextCheaper(nowst);if(nextc == -1){float addgas = cmax - nowgas;nowgas = cmax;cost += addgas * st[nowst].price;nowgas -= needgas;nowst = nowst + 1;}else{needgas = (st[nextc].dist - st[nowst].dist) / davg;float addgas = needgas - nowgas;if(addgas > 0){nowgas += addgas;cost += addgas * st[nowst].price;}nowgas -= needgas;nowst = nextc;}}if(nowst == n - 1)cout << fixed << setprecision(2) << cost << endl;else{float maxdist = st[nowst].dist;cout << "The maximum travel distance = "<< fixed << setprecision(2) << maxdist << endl;}}return 0;}
下面是我模仿大神自己手写的代码,几乎都修改的完全一样了。。。目前还是过不了。郁闷有时间再研究一下啦。。。现在 真的发现不了什么错误了
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;struct station{ float pri; float dis;}a[999];int c,d,davg,n;int cmp(station t1,station t2){ return t1.dis<t2.dis;}int next(int now){ for(int i=now+1;i<=n&&a[i].dis-a[now].dis<=c*davg;i++) { if(a[i].pri<a[now].pri) return i; } return -1;} int main(){ int i; while(cin>>c>>d>>davg>>n) { for(i=0;i<n;i++) { scanf("%f %f",&a[i].pri,&a[i].dis); } a[n].pri=-1; a[n].dis=d; sort(a,a+n,cmp); // for(i=0;i<n;i++) //printf("%f %f\n",a[i].dis,a[i].pri); int nowst=0; float anspri=0,ansdis=0,nowgas=0; while(nowst<n) { if(nowst==0&&a[0].dis!=0) { ansdis=0; break; } float needgas=(a[nowst+1].dis-a[nowst].dis)/davg; if(needgas>c) { ansdis+=davg*c; break; } int nextst=next(nowst); // printf("%d %d %f\n",nowst,nextst,anspri); if(nextst==-1) { anspri+=(c-nowgas)*a[nowst].pri; nowgas=c-needgas; ansdis=a[nowst+1].dis; nowst+=1; } else { float addgas=(a[nextst].dis-a[nowst].dis)/davg-nowgas; if(addgas>0) { nowgas=0; anspri+=addgas*a[nowst].pri; } else nowgas-=needgas; nowst=nextst; ansdis=a[nowst].dis; } } if(nowst==n) printf("%.2f\n",anspri); else printf("The maximum travel distance = %.2f\n",ansdis); } return 0;} /************************************************************** Problem: 1437 User: HCA1101 Language: C++ Result: Wrong Answer****************************************************************/
- 九度OJ #1437 To Fill or Not to Fil
- 九度oj 1437 To Fill or Not to Fill
- 九度OJ 1437 To Fill or Not to Fill -- 贪心算法
- 九度OJ 1437 To Fill or Not to Fill ( 贪心算法)
- 【学习笔记】〖九度OJ〗题目1437:To Fill or Not to Fill
- 九度OJ 题目1437:To Fill or Not to Fill
- 九度OJ 题目1437:To Fill or Not to Fill
- 九度OJ-浙大机试-题目1437:To Fill or Not to Fill
- 九度OJ 1437 To Fill or Not to Fill -- 贪心算法
- To Fill or Not to Fill PAT/九度OJ 分析
- To Fill or Not to Fill (九度贪心题目)
- 九度考研真题 浙大 2012-3浙大1437:To Fill or Not to Fill
- 题目1437:To Fill or Not to Fill 题目25
- 25-题目1437:To Fill or Not to Fill
- 题目1437:To Fill or Not to Fill
- 题目1437:To Fill or Not to Fill
- 1033. To Fill or Not to Fill
- 1033. To Fill or Not to Fill
- qte参数配置介绍
- TCP/IP协议栈
- htonl() htons()及inet_ntoa() inet_addr()
- 【Web优化】Yslow优化法则(三)添加缓存控制首部
- 关于QT中用QTcpserver 和QTcpsocket接收和发送数据的一个规则理解
- 九度OJ #1437 To Fill or Not to Fil
- vim之折叠
- Linux c 信号—pause、sigsuspend 的相同于区别
- 《编程之美》之CPU曲线
- 最小二乘法(最小平方法)
- 利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
- 红黑树的实现与应用
- C++中引用与指针
- LIS问题(转换成LCS解法 O(n*n))