P1016 旅行家的预算

题面唉~~

唔。。这是我当初好久好久之前做过的一道题,然后,就压仓库了??

前两天正好听到srj提到这道题,就正好拿出来做一下

那么还是一个不太难想的贪心,我也不知道为什么之前只有50分。。

 1 #include <bits/stdc++.h>
 2 double D0,C,D,cost,left;
 3 struct node
 4 {
 5     double d,p;
 6 }s[8];
 7 int n;
 8 bool cmp(node a,node b){return a.d<b.d;}
 9 int main()
10 { 
11     scanf("%lf%lf%lf%lf%d",&D0,&C,&D,&s[0].p,&n);
12     s[n+1].d=D0;
13     for(int i=1;i<=n;i++)
14     {
15         scanf("%lf%lf",&s[i].d,&s[i].p);
16         if(s[i].d-s[i-1].d>C*D)//中间有一段路加满油也到不了下个节点
17         {
18             printf("No Solution");
19             return 0;
20         }
21     }
22     std::sort(s+1,s+1+n,cmp);
23     for(int i=0;i<=n+1;)
24     {
25         int j,k;
26         for(j=k=i+1;j<=n;j++)//若直达终点,j++后j为n+1而不是n+2
27         {
28             k=s[j].p<=s[k].p?j:k;//范围内最小花费
29             if(s[j].p<=s[i].p||s[j+1].d-s[i].d>C*D)break;//找到下一个比当前节点便宜的节点或者到不了下个节点
30         }
31         if(s[j].p>s[i].p)//策略2
32         {
33             cost+=(C-left)*s[i].p,left=C-(s[k].d-s[i].d)/D;
34             i=k;
35         }
36         else
37             cost+=s[i].p*((s[j].d-s[i].d)/D-left),i=j,left=0;//策略1
38     }
39     printf("%.2lf",cost);
40     return 0;
41 }

lalala

posted @ 2019-09-08 12:38  喵呜,颜儿ღ  阅读(109)  评论(0编辑  收藏  举报