旅行家的预算
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出格式
输入格式:
第一行,D1,C,D2,P,N。
接下来有N行。
第i+1行,两个数字,油站i离出发点的距离Di和每升汽油价格Pi。
输出格式:
所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出样例
输入样例1#:
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出样例1#:
26.95
【数据范围】
N<=6
贪心,每次找最近的比当前价格便宜的加油站,刚好开到那,如果没有,就把油加满,开往下一个目的地。
代码:
1 //2017.10.31
2 //greedy
3 #include<iostream>
4 #include<cstdio>
5 #include<cstring>
6 #include<algorithm>
7 using namespace std;
8 namespace lys{
9 struct road{
10 double dis;
11 double add;
12 }gas[16];
13 int n;
14 double d1,d2,c,p,ans,s,x,y;
15 bool cmp(const road &x,const road &y){return x.dis<y.dis;}
16 int main(){
17 int i,j,k;
18 scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p,&n);
19 gas[1].dis=0,gas[1].add=p;
20 n+=2;
21 gas[2].dis=d1,gas[2].add=0;
22 for(i=3;i<=n;i++) scanf("%lf%lf",&gas[i].dis,&gas[i].add);
23 s=c*d2;
24 sort(gas+1,gas+n+1,cmp);
25 for(i=1;i<=n;){
26 if(gas[i+1].dis-gas[i].dis>s){
27 puts("No Solution");
28 return 0;
29 }
30 for(k=i+1;k<=n&&(gas[k].dis-gas[i].dis)<=s;k++)
31 if(gas[k].add<=gas[i].add){
32 y=(gas[k].dis-gas[i].dis)/d2;
33 if(x<y) ans+=(y-x)*gas[i].add,x=0;
34 else x-=y;
35 i=k;
36 break ;
37 }
38 if(i==n){
39 printf("%.2lf\n",ans);
40 return 0;
41 }
42 if(i!=k){
43 ans+=gas[i].add*(c-x);
44 x=c-(gas[i+1].dis-gas[i].dis)/d2;
45 i++;
46 }
47 }
48 return 0;
49 }
50 }
51 int main(){
52 lys::main();
53 return 0;
54 }
来源:https://www.cnblogs.com/Liisa/p/7761417.html