旅行家的预算
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离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,其余数字≤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 }