贪心——洛谷P1016 旅行家的预算

https://www.luogu.org/problem/show?pid=1016

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);
}
posted @ 2017-04-17 10:49  largecube233  阅读(179)  评论(0编辑  收藏  举报