zoukankan      html  css  js  c++  java
  • Luogu P1016 旅行家的预算

    gate

    再次感叹我太水了..

    贪心策略:

    设当前加油站为i,

    若i能到达的加油站中有油价比i低的加油站j,则在i加刚好能到达j的油,i→j

    若没有,则在i把油加满(注意不要超出终点),i→i能到达的加油站中油价最低的一个

    因为double写成int$debug$快一周...

    代码如下qaq

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define MogeKo qwq
    using namespace std;
    
    const int maxn = 1005;
    const int INF = 0x3f3f3f3f;
    int n,u;
    double m,c,d,v,sum;
    
    struct node {
        double s,p;
        bool operator < (const node &N) const {
            return s < N.s;
        }
    } a[maxn];
    
    int main() {
        scanf("%lf%lf%lf%lf%d",&m,&c,&d,&a[0].p,&n);
        for(int i = 1; i <= n; i++)
            scanf("%lf%lf",&a[i].s,&a[i].p);
        sort(a+1,a+n+1);
        a[n+1].s = m;
        a[n+1].p = INF;
        for(int i = 0; i < n+1;) {
            int k = n+1;
            for(int j = i+1; j <= n; j++) {
                if((a[j].s - a[i].s) > c*d) break;
                if(a[j].p < a[k].p) k = j;
                if(a[j].p < a[i].p) break;
            }
            if((a[k].s - a[i].s) > c*d) {
                printf("No Solution");
                return 0;
            }
            if(a[k].p < a[i].p) {
                sum += a[i].p * ((a[k].s - a[i].s)/d - v);
                v = 0;
            } else {
                double v_now = min(c,(a[n+1].s-a[i].s)/d);
                sum += a[i].p * (v_now-v);
                v = v_now - (a[k].s-a[i].s)/d;
            }
            i = k;
        }
        printf("%.2lf
    ",sum);
        return 0;
    }
    View Code
  • 相关阅读:
    java大数取余
    hdu--5351--MZL's Border
    NYOJ--水池数目
    NYOJ--32--SEARCH--组合数
    NYOJ--20--搜索(dfs)--吝啬的国度
    hdu--4148--Length of S(n)
    hdu--2098--分拆素数和
    hdu--1873--看病要排队
    hdu--1870--愚人节的礼物
    hdu--1237--简单计算器
  • 原文地址:https://www.cnblogs.com/mogeko/p/11767661.html
Copyright © 2011-2022 走看看