九度oj 1437 贪心
来源:互联网 发布:深海逃生剧情 知乎 编辑:程序博客网 时间:2024/05/01 14:14
我的思路是对于每个加油站,计算出在此加油站所能加的最大的油量所能覆盖最大的距离中没单位距离所需要的价钱,若两个加油站覆盖的距离有交集,那么这个交集部分选价钱小的那个,另一个退出这个交集。
同时,我们需要注意精度
const double eps=1e-8
fabs(a-b)<eps 等价于a==b
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>#define ISYEAP(x) x%100!=0 && x%4==0 || x%400==0 ? 1:0using namespace std;long long int arr[610];const double eps=1e-8;double Cmax;//油箱体积double Dis;//起始与终点的距离double Davg;//一升油能跑的距离int N;//加油站的个数struct oilStation{ double price; double distanceToHangzhou;};struct ratio{ double start; double end; double priceRatio; bool weatherIsWork;}rat[510];void input(){ oilStation temp; for(int i=0;i<N;i++){ scanf("%lf%lf",&temp.price,&temp.distanceToHangzhou); rat[i].start=temp.distanceToHangzhou; rat[i].end=rat[i].start+Cmax*Davg; rat[i].priceRatio=temp.price/Davg; rat[i].weatherIsWork=true; }}bool cmp(ratio a,ratio b){ if(a.start==b.start){ return a.priceRatio<b.priceRatio; } return a.start<b.start;}void findSolution(){ for(int i=0;i<N-1;i++){ for(int j=i+1;j<N;j++){ if(rat[i].weatherIsWork==false) continue; if(rat[i].end-rat[j].start<eps){ break; } if(fabs(rat[i].start-rat[j].start)<eps && fabs(rat[i].end-rat[j].end)<eps){ if(rat[i].priceRatio-rat[j].priceRatio<eps ) rat[j].weatherIsWork=false; else{ rat[i].weatherIsWork=false; } continue; } if((rat[i].start-rat[j].start)>=eps&& (rat[i].end-rat[j].end)<=eps){ rat[i].weatherIsWork=false; break; } if(rat[i].end-rat[j].start>eps){ if( rat[i].priceRatio-rat[j].priceRatio<eps){ rat[j].start=rat[i].end; } else{ rat[i].end=rat[j].start; } } } } float start=0; float end=0; float NeedMoney=0; for(int i=0;i<N;i++){ if(end==Dis) break; if(rat[i].weatherIsWork==false || rat[i].start==rat[i].end) continue; if(start==end && rat[i].start!=0){ break; } else{ if(end==rat[i].start){ if(rat[i].end>=Dis) { rat[i].end=Dis; } NeedMoney+=rat[i].priceRatio*(rat[i].end-rat[i].start); end=rat[i].end; } } } int abs=(int)(NeedMoney*100); if(NeedMoney*100-abs>=0.5) { abs=abs+1; } if(end<Dis){ printf("The maximum travel distance = %.2lf\n",end-start); } else{ printf("%.2lf\n",(double)abs/100); }}int main(){ while(scanf("%lf%lf%lf%d",&Cmax,&Dis,&Davg,&N)!=EOF){ input(); sort(rat,rat+N,cmp); findSolution(); }}
0 0
- 九度oj 1437 贪心
- 【九度OJ】1038【贪心】
- 九度OJ 1082 代理服务器 -- 贪心算法
- 九度OJ 1433 FatMouse -- 贪心算法
- 九度OJ 1433 贪心算法
- 九度OJ 1172:哈夫曼树 (贪心)
- 九度OJ 1433 FatMouse(贪心)
- 九度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 1107:搬水果 (贪心)
- 【九度OJ】:九度OJ 1050
- 【九度OJ】:九度OJ 1053
- 【九度OJ】:九度OJ 1056
- 【九度OJ】:九度OJ 1059
- 【九度OJ】:九度OJ 1206
- 九度OJ 1463 贪心算法、优先队列、运算符重载之《招聘会》
- 九度oj 1504:把数组排成最小的数 (贪心)
- POJ 2187 Beauty Contest(凸包优化 || 凸包+旋转卡壳)
- 梦想和面包能否兼得?
- 算法-蓝桥杯习题(3-4)
- 初识AutoMapper
- first
- 九度oj 1437 贪心
- 递归转换为二进制
- 类与接口
- P23 (**) Extract a given number of randomly selected elements from a list.
- 一维/二维动态数组分配(C语言)
- TCP/IP、Http、Socket的区别
- C语言 printf函数的返回值
- Java 创建不可变对象-final关键字的使用总结
- 为Java说句公道话