旅行家的预算

题目描述

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pii=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

输入格式

第一行,D1CD2PN

接下来有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

说明/提示

 N6,其余数字500

 

分析:

说这题简单的都是大佬(当然不排除抄题解咳咳),这题告诉你精度的意义。。。算法不难,就是一个简单的贪心就完事了。。。

 

CODE:

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 const int M=1000005;
 8 double s,all,per,pfir;
 9 int n;
10 double p[M],d[M];
11 double ans;
12 void isok(){
13     for (int i=1;i<n;i++){
14         if (d[i+1]-d[i]>all*per) {
15             cout<<"No Solution"<<endl;
16             exit(0);
17         }
18     }
19     if (s-d[n]>all*per){
20         cout<<"No Solution"<<endl;
21         exit(0);
22     }
23     return ;
24 }
25 int main() {
26     cin>>s>>all>>per>>pfir>>n;
27     n++;
28     for (int i=2;i<=n;i++) cin>>d[i]>>p[i];
29     d[1]=0,p[1]=pfir;
30     isok();
31     d[++n]=s;p[n]=-1;
32     double nowp=0;
33     for (int i=1;i<n;){
34         bool flag=false;
35         int j;
36         for (j=i+1;j<=n;j++) {
37             if (p[j]<p[i]&&d[j]-d[i]<=all*per) {flag=true;break;}
38         }
39         if (flag){
40             if (j==n) {ans+=((d[n]-d[i])/per-nowp)*p[i];break;}
41             else ans+=(d[j]-d[i])/per*p[i];    
42             i=j;
43         }
44         else {
45             double minn=1<<30;
46             int minpos=i+1,k;
47             for (k=i+1;k<=n;k++){
48                 if (d[k]-d[i]>all*per) break;
49                 if (p[k]<minn) minpos=k,minn=p[k];
50             }
51             if (minpos==n) ans+=((d[n]-d[i])/per-nowp)*p[i];
52             else {
53                 ans+=(all-nowp)*p[i];
54                 nowp=all-(d[minpos]-d[i])/per;
55             }
56             i=minpos;
57         }
58         //cout<<i<<" "<<nowp<<" "<<ans<<" "<<d[i]<<" "<<all*per<<endl;
59     }
60     //ans+=(s-d[n])/per*p[n];
61     printf ("%.2lf",ans);
62     return 0;
63 }

 

posted @ 2019-08-19 22:15  Sword_Art_Online  阅读(192)  评论(0编辑  收藏  举报