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; }

浙公网安备 33010602011771号