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

思路:贪心算法
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 题目1087:约数的个数

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

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

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

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

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

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

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

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

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

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

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

  9. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

随机推荐

  1. js获取上传的文件并用ajax提交

    <form id="form1" name="form1" encType="multipart/form-data" method= ...

  2. asp.net获取客户端IP方法(转载)

    最近web获取客户端ip,看到下面这篇文章,转载过来,一起分享(转载地址:http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html) 通 ...

  3. vim扩展配置

    在用户根目录下新建 “.vimrc”文件,键入一下代码: set syntax=on "高亮语法 set fenc=utf- "设定默认解码 set fencs=utf-,usc- ...

  4. [Hadoop源码解读](二)MapReduce篇之Mapper类

    前面在讲InputFormat的时候,讲到了Mapper类是如何利用RecordReader来读取InputSplit中的K-V对的. 这一篇里,开始对Mapper.class的子类进行解读. 先回忆 ...

  5. windows下adb+flash_image刷机

    刷机是常事,总要把刷机包放在卡上,然后关机三键一起按到recovery再刷,觉得不爽,麻烦,所以研究出了adb调用flash_image刷system分区,全部脚本windows脚本执行,点点鼠标就o ...

  6. Cortex-M3学习日志(四) -- UART0实验

    LPC1768含有4 个符合16C550工业标准的异步串口UATR0-UART3,其中UART1具有标准的MODEM接口和RS-485/EIA-485接口模式.串口通讯接口是连接计算机.终端.通讯控制 ...

  7. .9 png图片的制作

    在android开发的过程中我们经常因为没有好的美工图片失真,这样使界面看起来要逊色很多,有的时候可能我们会想在drawable-hdpi,ldpi,mdpi下放不同分辨率的图片,这样虽然可以有效避免 ...

  8. python语言中的AOP利器:装饰器

    一.前言 面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java ...

  9. C#2.0 迭代器

    迭代器 迭代器模式是和为模式的一种范例,我们访问数据序列中所有的元素,不用关心序列是什么类型.从数据管道中数据经过一系列不同的转换或过滤后从管道的另一端出来. 像数组.集合等已经内置了迭代器,我们可以 ...

  10. 无法生成core dump文件的几个原因

    1. 进程无写权限(如目录不可写.存在同名的非regular文件(目录或符号链接)等) 2. 存在同名文件且有多个hard link 3. 文件系统空间不足 4. 指定目录不存在 5. 进程的RLIM ...