lg1016 [NOIP1999 提高组] 旅行家的预算

在范围内,去油价最便宜的地方

1. 更便宜 最近最好 刚好用完

2.////////// 加满

先有架构 -》 边界问题

/*
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2

26.95

200.0 100.0 2.0 4.00 2
50.0 3.00
60.0 2.00

255.00

87.75 13.03 5.75 7.29 3
22.10 7.38
24.21 6.81
82.08 6.96

105.95
*/
#include <bits/stdc++.h>
using namespace std;

double D0,C,D,cost,l;
struct node
{
    double d,p;
}s[8];
int n;
bool cmp(node a,node b){return a.d<b.d;}
int main()
{ 
    scanf("%lf%lf%lf%lf%d",&D0,&C,&D,&s[0].p,&n);
    s[n+1].d=D0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf",&s[i].d,&s[i].p);
    }
    sort(s+1,s+1+n,cmp);
    for(int i=1;i<=n+1;i++)
    {
        if(s[i].d-s[i-1].d>C*D)//中间有一段路加满油也到不了下个节点
        {
            printf("No Solution");
            return 0;
        }
    }
    
    for(int i=0;i<=n+1;)
    {
        int j,k;
        for(j=k=i+1;j<=n;j++)//n+1也要算
        {         
            k= s[j].p<=s[k].p ? j:k;//范围内最小花费
            if(s[j].p<s[i].p||s[j+1].d-s[i].d>C*D) break;//找到下一个最近的比当前节点便宜的节点或者到不了下个节点
        }
        if(s[j].p>s[i].p)//策略2
        {
            cost+=(C-l)*s[i].p,l=C-(s[k].d-s[i].d)/D;
            i=k;
        }
        else//策略1
        {
           //if((s[k].d-s[i].d)/D>=l) 否则已走
           cost+=s[i].p*((s[j].d-s[i].d)/D-l),i=j,l=0;
           //else i=k,l-=(s[k].d-s[i].d)/D;
        }
            
    }
    
    printf("%.2lf",cost);
    return 0;
}
View Code

 

posted @ 2023-07-06 14:36  JMXZ  阅读(5)  评论(0)    收藏  举报