题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)
2014-07-28 22:19
603 查看
//贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include<algorithm> struct Node { float p, d; }; bool cmp(Node a, Node b) { return a.d < b.d; } int main() { Node node[501]; float Cmax, D, Davg, distance, price, Ccur, Pcur, j;//double 会出问题,蛋疼 int N, Ncur, i, k, flag; //while (cin >> Cmax >> D >> Davg >> N) while (scanf_s("%f%f%f%d", &Cmax, &D, &Davg, &N) != EOF) { for (i = 1; i <= N; i++) { //cin >> node[i].p >> node[i].d; scanf_s("%f%f", &node[i].p, &node[i].d); } //sort station by distance sort(node + 1, node + 1 + N, cmp); if (N == 0 || node[1].d > 0.00001 || node[1].d < -0.00001)//第一个站点不在距离0处 { printf("The maximum travel distance = 0.00\n"); } else//greedy now { price = 0;//当前花费 distance = 0;//当前距离 Ncur = 1;//当前所在加油站 Ccur = 0;//当前汽油数量 Pcur = node[1].p;//当前加油站的油价 while (Ncur <= N) { //1.using 【remain】 gas find 【nearest】 【cheaper】 station flag = -1; for (i = Ncur + 1; i <= N&&node[i].d <= distance + Ccur*Davg; i++) { if (node[i].p < Pcur) { flag = i; break; } } if (flag != -1)//find a station,and get there { //price 未变 Ccur -= (node[flag].d - distance) / Davg;//当前汽油数量===注意与下面表达式的计算顺序 distance = node[flag].d;//当前距离 Ncur = flag;//当前所在加油站 Pcur = node[flag].p;//当前加油站的油价 continue; } //else 1: 2.using 【Cmax】 find 【nearest】 【cheaper】 station flag = -1; for (i = Ncur + 1; i <= N&&node[i].d <= distance + Cmax*Davg; i++) { if (node[i].p < Pcur) { flag = i; break; } } if (flag != -1)//find a station,and get there { price += ((node[flag].d - distance) / Davg - Ccur)*node[Ncur].p;//当前花费 distance = node[flag].d;//当前距离 Ncur = flag;//当前所在加油站 Pcur = node[flag].p;//当前加油站的油价 Ccur = 0;//当前汽油数量:到K后的汽油为0 continue; } //else 2: 3.get the Cmax and go as far as possible flag = -1; for (i = Ncur + 1; i <= N&&node[i].d <= distance + Cmax*Davg; i++) { flag = i; } if (flag != -1)//can get some one station,and get there { price += (Cmax - Ccur)*node[Ncur].p;//当前花费 distance = node[flag].d;//当前距离 Ncur = flag;//当前所在加油站 Pcur = node[flag].p;//当前加油站的油价 Ccur = Cmax - (node[flag].d - distance) / Davg;//当前汽油数量 continue; } else//can not get some one station,over { printf("The maximum travel distance = %.2f\n", distance + Cmax*Davg); break; } } if (Ncur > N) { printf("%.2lf\n", price); } } } return 0; }
相关文章推荐
- 贪心算法题目:To Fill or Not to Fill
- 一道贪心题目(To Fill or Not to Fill )
- 【学习笔记】〖九度OJ〗题目1437:To Fill or Not to Fill
- To Fill or Not to Fill (九度贪心题目)
- 九度 题目1437:To Fill or Not to Fill
- 25-题目1437:To Fill or Not to Fill
- 题目1437:To Fill or Not to Fill(贪心算法)
- 【学习笔记】〖九度OJ〗题目1437:To Fill or Not to Fill
- 九度OJ 题目1437:To Fill or Not to Fill
- 题目1437:To Fill or Not to Fill
- 九度OJ-浙大机试-题目1437:To Fill or Not to Fill
- 九度OJ 题目1437:To Fill or Not to Fill
- 题目1437:To Fill or Not to Fill
- 题目1437:To Fill or Not to Fill(贪心算法)
- To Fill or Not to Fill (九度贪心题目)
- 题目1437:To Fill or Not to Fill 题目25
- 九度OJ-浙大机试-题目1437:To Fill or Not to Fill
- 获取Android源码时如何解决【fatal: Unable to look up android.git.kernel.org (port 9418) (Name or service not known)】的问题
- PAT 1033 To Fill or Not to Fill 贪心
- 贪心算法 解决 活动选择问题