华师一附中OI组
标题:
P1016 旅行家的预算
[打印本页]
作者:
admin
时间:
2018-5-1 15:15
标题:
P1016 旅行家的预算
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离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
作者:
吴语林
时间:
2018-7-24 22:13
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
double d[1000]={0},p[1000],dm,s,c,money=0,oil=0;
int n;
void aha(int mu,int no,int l)
{
if(no==n+1)
{
printf("%.2lf",money);
return ;
}
if(no<mu)
{
int e=l;
if(p[no]<p[l])
money-=oil*(p[l]-p[no]),e=no;
oil-=(d[no+1]-d[no])/dm;
aha(mu,no+1,e);
return ;
}
else if(no==mu)
{
int k=no+1;
while(p[k]>p[no])
k++;
if(d[k]-d[no]<=dm*c)//跑得到
{
if(oil<(d[k]-d[no])/dm)
{
money+=((d[k]-d[no])/dm-oil)*p[no];
oil=(d[k]-d[no])/dm;
}
aha(k,no,no);
return ;
}
else//跑不到
{
int t=no+1;
while(d[t]-d[no]<=dm*c)//跑的越远越好
t++;
money+=(c-oil)*p[no],oil=c;
aha(t-1,no,no);
return ;
}
}
}
int main()
{
scanf("%lf%lf%lf%lf%d",&s,&c,&dm,&p[0],&n);
for(int i=1;i<=n;++i)
{
scanf("%lf%lf",&d[i],&p[i]);
if(d[i]-d[i-1]>dm*c)
{
printf("No Solution");
return 0;
}
}
d[n+1]=s;
if(d[n+1]-d[n]>dm*c)
{
printf("No Solution");
return 0;
}
aha(0,0,0);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2