1916: 【贪心】旅行家的预算
时间限制: 1 Sec 内存限制: 128 MB提交: 49 解决: 11
[ 提交][ 状态][ 讨论版]
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入
第一行有四个数,分别表示D1,C,D2,P,N
接下来有N行,每行2个数,分别表示油站i离出发点的距离Di和每升汽油价格Pi
接下来有N行,每行2个数,分别表示油站i离出发点的距离Di和每升汽油价格Pi
输出
最小费用
样例输入
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
样例输出
26.95
题解:贪心例题,首先将n+2个地点按距离排序,如果当前在i油站,前方能够到达的地方如果有比i更便宜的加油站,则将油加到恰好能够到达就好,否则就加满油去下一个加油站。
#include<stdio.h>
#include <algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<deque>
#include<ctype.h>
#include<map>
#include<set>
#include<stack>
#include<string>
#include<algorithm>
#define ll long long
#define INF 0x3f3f3f3f
#define FAST_IO ios::sync_with_stdio(false)
using namespace std;
struct node
{
double d,p;
};
node a[10005];
int cmp(node a,node b)
{
if(a.d!=b.d)
return a.d<b.d;
else
return a.p<b.p;
}
int main()
{
double d1,c,d2,p;
int n,i;
cin>>d1>>c>>d2>>p>>n;
a[1].d=0,a[1].p=p;
a[2].d=d1,a[2].p=0;
for(n+=2,i=3;i<=n;i++)
cin>>a[i].d>>a[i].p;
sort(a+1,a+n+1,cmp);
int k=1,j;
double s=c*d2,ans=0,x=0;
while(k<=n)
{
if(a[k+1].d-a[k].d>s)
{
cout<<"No Solution"<<endl;
return 0;
}
for(j=k+1;a[j].d-a[k].d<=s && j<=n;j++)
if(a[j].p<=a[k].p)
{
double y=(a[j].d-a[k].d)/d2;
if(x<y)
ans+=a[k].p*(y-x);
else
x-=y;
k=j;
break;
}
if(fabs(a[k].d-d1)<=0.0001)
{
printf("%.2lf\n",ans);
return 0;
}
if(j!=k)
{
ans+=a[k].p*(c-x);
x=c-(a[k+1].d-a[k].d)/d2;
k++;
}
}
return 0;
}