【洛谷 1016】 旅行家的预算

来源:互联网 发布:linux下jdk怎么卸载 编辑:程序博客网 时间:2024/05/23 15:48

思路

贪心经典题。要把所有的加油站先排序,之后扫一遍,每一个加油站是否加油主要看从这个加油站开始,能走的路程里面是否存在一个比这个加油站便宜的:

  • 如果存在,找到第一个比他便宜的,加油加到这里;
  • 如果不存在,就把油加满,走到哪里算哪里。

代码

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef double db;struct node{    db dis, val;    bool operator < (const node & a)const{        return dis == a.dis ? val < a.val : dis < a.dis;    }};node p[110];db d1, c, d2, p1, max_dis = 0;int n, t;int main(){    cin >> d1 >> c >> d2 >> p1 >> n;    max_dis = c * d2;    p[++t].dis = 0, p[t].val = p1;    p[++t].dis = d1, p[t].val = 0;    t ++;    for(int i = 1; i <= n; i ++, t ++)        cin >> p[t].dis >> p[t].val;    t --;    sort(p+1, p+1+t);    db left = 0, cost = 0;    for(int i = 1; i < t; i ++){        int to = i, pos;        db min_cost = p[i].val;        left -= ((p[i].dis - p[i-1].dis) / d2);        while(p[to+1].dis - p[i].dis <= max_dis){            to ++;            if(p[to].val < min_cost){                min_cost = p[to].val;                pos = to;                break;            }        }        if(to == i){            printf("No Solution");            return 0;        }        if(min_cost >= p[i].val){            cost += (c-left) * p[i].val;            left = c;        }else if(left*d2 < p[pos].dis - p[i].dis){            db tt = ((p[pos].dis - p[i].dis) / d2 - left);            cost += tt * p[i].val;            left += tt;        }    }    printf("%.2f", cost);    return 0;}

光看初赛了,好久不写了,写的真丑。。。

0 0
原创粉丝点击