题目大意:小明从杭州去往某目的地,要经过一些加油站,每个加油站的价格不一样。若能顺利到达,求加油费用最少为多少,否则求出能行驶的最远距离。

思路:贪心算法
1>若下一加油站的价格更便宜,则只需走到下一加油站即可。
2>若下一结点的价格没有该节点便宜
1.若将油箱加满,看看在其能到达的最远距离内,是否有比该点更便宜的站点。若有,则正好到达这个跟便宜的点即可;否则,将油箱加满,然后到达这段距离内价格最小的点(除当前点外)。

代码如下:

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
struct station{
    double price;
    double dis;
}sta[502];

int cmp(const void *a,const void *b){
    station* p = (station *)a;
    station* q = (station *)b;
    return p->dis - q->dis;
}

int main(){
    double cmax,d,davg;
    int n,i,j;
    double nowgas,length,cost;
    while(scanf("%lf%lf%lf%d",&cmax,&d,&davg,&n) != EOF){
        nowgas = 0;
        length = 0;
        cost = 0;
        for(i=0; i<n; i++)
            scanf("%lf%lf",&sta[i].price,&sta[i].dis);
        qsort(sta,n,sizeof(station),cmp);
        if(n == 0 || sta[0].dis != 0){
            printf("The maximum travel distance = 0.00\n");
            continue;
        }
        sta[n].price = 0;
        sta[n].dis = d;
        for(i=0; i<n; i++){
            if(cmax*davg < sta[i+1].dis - sta[i].dis){
                length += cmax*davg;
                break;
            }
            else if(sta[i+1].price <= sta[i].price){
                if(nowgas*davg >= sta[i+1].dis-sta[i].dis){
                    length += sta[i+1].dis-sta[i].dis;
                    nowgas -= (sta[i+1].dis-sta[i].dis)/davg;
                }
                else{
                    length += sta[i+1].dis-sta[i].dis;
                    cost += ((sta[i+1].dis-sta[i].dis)/davg - nowgas) * sta[i].price;
                    nowgas = 0;
                }
            }
            else{
                int len = cmax*davg;
                j = i+1;
                int next = i+1;
                int min = sta[i+1].price;
                while(sta[j].dis - sta[i].dis <= len){
                    if(min >= sta[j].price){
                        next = j;
                        min = sta[j].price;
                    }
                    if(sta[j].price <= sta[i].price)
                        break;
                    j++;
                }
                if(sta[j].dis - sta[i].dis <= len){
                    if(nowgas*davg < sta[j].dis - sta[i].dis){
                        cost += (sta[j].dis - sta[i].dis - nowgas*davg) / davg * sta[i].price;
                        nowgas = 0;
                        length += sta[j].dis - sta[i].dis;
                    }
                    else{
                        length += sta[j].dis - sta[i].dis;
                        nowgas -= (sta[j].dis - sta[i].dis) / davg;
                    }
                    i = j-1;
                }
                else{
                    j = next;
                    cost += (cmax - nowgas) * sta[i].price;
                    nowgas = cmax - (sta[j].dis - sta[i].dis) / davg;
                    length += sta[j].dis - sta[i].dis;
                    i = j-1;
                }
            }
        }
        if(i < n){
            printf("The maximum travel distance = %.2lf\n",length);
        }
        else{
            printf("%.2lf\n",cost);
        }
    }
    return 0;
}

九度OJ 1437 To Fill or Not to Fill的更多相关文章

  1. 九度oj 1437 To Fill or Not to Fill 2012年浙江大学计算机及软件工程研究生机试真题

    题目1437:To Fill or Not to Fill 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1488 解决:345 题目描述: With highways availabl ...

  2. 九度OJ 1437 To Fill or Not to Fill -- 贪心算法

    题目地址:http://ac.jobdu.com/problem.php?pid=1437 题目描述: With highways available, driving a car from Hang ...

  3. 九度OJ #1437 To Fill or Not to Fil

    题目描写叙述: With highways available, driving a car from Hangzhou to any other city is easy. But since th ...

  4. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  5. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  6. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

  7. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  8. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  9. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

随机推荐

  1. c# 检测操作系统版本

    我们通过System.Environment.OSVersion.Version获得操作系统的版本号,然后再根据版本号进行判断操作系统是什么版本 Version 类的属性 Operating syst ...

  2. QT显示歌词渐变

    central = new QWidget(this); setCentralWidget(central); central->setAutoFillBackground(true); cen ...

  3. [bzoj1911][Apio2010]特别行动队

    Description 有个元素,可以将个元素分成多组,每组的元素编号必须是连续的. 设每组的为,则每组的价值公式为. 求最大价值和. Input 输入由三行组成. 第一行包含一个整数,表示士兵的总数 ...

  4. Mac Pro 入门、遇到的问题、个性化设置 汇总

    入门资料 入门一:Mac 基本用法 入门二:Mac 使用VMware Fusion虚拟机 入门三:Mac 使用brew安装软件 问题汇总 [问题1]如何复制文本? 一只手指头按下,另外一只手指头滑动选 ...

  5. linux系统下安装wget。

    我们先安装linux系统比如centos7.1里面有的就没有wget下载工具.wget这个命令就不可以使用. 我们使用 yum -y install wget yum install perl 会出现 ...

  6. HDU 3452 Bonsai

    可以转化成最小割的求解,题目其实就是要求把点分成两个集合,增加一个超级汇点,一部分的点在根节点所在集合内,一部分节点在超级汇点所在的集合内,这两就分开了,又要求费用最小,那么就是最小割. #inclu ...

  7. 用Qemu搭建aarch32学习环境

    作者信息 作者: 彭东林 邮箱: pengdonglin137@163.com QQ: 405728433 软件平台 主机: Ubuntu14.04 64位版本 模拟器:Qemu-2.8.0 Linu ...

  8. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  9. Ubuntu下的Wine&amp;WineQQ

    一.安装Wine 1.添加PPA sudo add-apt-repository ppa:ubuntu-wine/ppa 2.更新列表 sudo apt-get update 3.安装Wine sud ...

  10. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)【转】

    本文转载自:https://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html 生成对抗网络(Generative Adversarial Netwo ...