1. 程式人生 > >貪心——洛谷P1016 旅行家的預算

貪心——洛谷P1016 旅行家的預算

1、先判斷下一個目的地,再計算油費和加的油
2、如果當前已經在最後一個加油站並且加滿油仍然走不到終點則輸出No Solution
3、每次在可以走到的範圍內找油費最小的加油站
2.1如果該加油站的油費當前所在地點的油費要便宜,就加恰好能開到該加油站的油
2.2否則判斷能否開到終點,如果能則加恰好能開到終點的油,否則加滿油
4、進行第2步的同時,尋找可以走到的最遠的加油站,如果最遠的加油站就是當前所在地點且當前不在終點的話輸出No Solution
5、如果最遠可以走到的最遠的加油站是終點,就輸出答案。

這個是洛谷題裡的;
寫的很好,仔細想想,就會先這個思路是有漏洞的;
再仔細想想這個題解其實是對的;
唯一不足的是題解作者程式碼,太爛了;

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include<algorithm>
#define Ll long long 
using namespace std;
struct you{double x,y;}a[152];
int n,now,mi;
double c,v,m,x,ans;
bool cmp(you a,you b){return a.x<b.x;}
int main()
{
    scanf
("%lf%lf%lf%lf%d",&v,&c,&m,&a[0].y,&n); for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y); sort(a+1,a+n+1,cmp); a[n+1].x=v;a[n+1].y=1e8; while(1){ v=1e9; for(int i=now+1;i<=n+1;i++) if(a[i].x<=a[now].x+c*m) if
(a[i].y<=v){ mi=i; v=a[i].y; }else;else break; if(v==1e9){printf("No Solution");return 0;} if(v<=a[now].y){ double need=(a[mi].x-a[now].x)/m; if(x>need)x-=need,need=0;else need-=x,x=0; ans+=need*a[now].y; now=mi; }else if(a[n+1].x<=a[now].x+c*m){ double need=(a[n+1].x-a[now].x)/m; if(x>need)x-=need,need=0;else need-=x,x=0; ans+=need*a[now].y; break; }else{ ans+=(c-x)*a[now].y; x=c-((a[mi].x-a[now].x)/m); now=mi; } } printf("%.2lf",ans); }