洛咕

题意:一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 \(D_1\)、汽车油箱的容量 \(C\)(以升为单位)、每升汽油能行驶的距离 \(D_2\)、出发点每升汽油价格\(P\)和沿途油站数 \(N\)(\(N\) 可以为零),油站 \(i\) 离出发点的距离 \(D_i\)、每升汽油价格 \(P_i\)(\(i=1,2,…,N\))。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出 No Solution

分析:贪心策略。从当前加油站出发,如果加油能到达一个油价比当前加油站低的加油站,那当前加油就只要保证刚好能够到达那个加油站即可(贪心策略一)。如果在当前加油站即使加满油也无法到达一个油价比当前加油站低的加油站,那么就加满油,下一个到达能到达的加油站里面油价最低的(贪心策略二)。如果加满油无法到达任何一个加油站就是无法到达目的地。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
char ch=getchar();int x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int mod=100000000;
const int N=1e5+5;
const int M=5e6+5;
double dis[10],pri[10];
int main(){
double d1,c,d2,p;int n;
cin>>d1>>c>>d2>>p>>n;
for(int i=1;i<=n;++i){
cin>>dis[i]>>pri[i];
}
dis[0]=0;pri[0]=p;//起点也看做一个加油站
double maxn=c*d2; //加满油最多能走的路程
int now_sta=0;double now_dis=0,ans=0,now_c=0;
//now_sta当前到达的加油站,now_dis当前走过的距离,now_c当前剩余油量能走的路程
while(1){
now_dis=dis[now_sta];
int bj=0,j=-1;
for(int i=now_sta+1;i<=n&&dis[i]-now_dis<=maxn;i++){
if(pri[i]<pri[now_sta]){//贪心策略一
ans+=((dis[i]-now_dis-now_c)/d2)*pri[now_sta];
now_c=0;
now_sta=i;
bj=1;
break;
}
else if(j==-1||pri[i]<pri[j])j=i;//贪心策略二寻找价格最低加油站
}
if(bj)continue;
if(d1-dis[now_sta]<=maxn){//已经可以到达目的地
ans+=((d1-dis[now_sta]-now_c)/d2)*pri[now_sta];
printf("%.2lf\n",ans);
break;
}
if(j==-1){
cout<<"No Solution";
break;
}
else{//贪心策略二更新状态
ans+=c*pri[now_sta];
now_c+=(maxn-dis[j]+now_dis);
now_sta=j;
continue;
}
}
return 0;
}

[NOIP1999 提高组] 旅行家的预算的更多相关文章

  1. NOIP1999提高组 题解报告

    T1 导弹拦截 题目大意:依次有\(n\) (\(n \le 10^5\))枚导弹,一套导弹拦截系统只能拦截一系列高度递减的导弹(一套系统拦截的弹道不一定相邻).求一套系统最多能拦截多少导弹,以及最少 ...

  2. [NOIP1999] 提高组 洛谷P1016 旅行家的预算

    题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  3. [NOIP1999] 提高组 洛谷P1014 Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...

  4. [NOIP2006] 提高组 洛谷P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  5. 旅行家的预算(NOIP1999&水题测试2017082301)

    题目链接:旅行家的预算 这题还可以,不算太水. 这题贪心即可. 我们采取如下动作: 如果在装满油的情况下能到达的范围内,没有加油站,则无解. 如果在装满油的情况下能到达的范围内,油价最低的加油站的油价 ...

  6. codevs 1046 旅行家的预算

    传送门 1046 旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold题解   题目描述 Des ...

  7. $NOIp$提高组历年题目复习

    写在前面 一个简略的\(NOIp\)题高组历年题目复习记录.大部分都有单独写题解,但懒得放\(link\)了\(QwQ\).对于想的时候兜了圈子的题打上\(*\). \(NOIp2018\ [4/6] ...

  8. NOIP 2015提高组复赛

    神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第 ...

  9. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  10. 【二分查找】 跳石头NOIP2015提高组 D2T1

    [二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...

随机推荐

  1. Canonical为所有支持的Ubuntu LTS系统发布了新的Linux内核更新

    Canonical近日为所有支持的Ubuntu LTS系统发布了新的Linux内核更新,以解决总共19个安全漏洞. 新的Ubuntu内核更新仅适用于长期支持的Ubuntu系统,包括Ubuntu 22. ...

  2. Solidity8.0-02

    对应崔棉大师 26-40课程https://www.bilibili.com/video/BV1yS4y1N7yu/?spm_id_from=333.788&vd_source=c81b130 ...

  3. PO培训

    30M 的step by step.带notes  这个文档把常用的包含java都有 不止是配置,反正各种处理都有.. 各种高清无码截图,还不算附件内容

  4. 使用python和adb来学习(学习通)

    在某一天赶课比较着急,奈何找不到人可以帮我,于是自己动手写了一个简单的脚本来学习 准备工作: 1.需要一个你不用的手机,打开手机的adb,因为需要用到adb来操作手机 2.进入百度智能云,申请一个 通 ...

  5. DataGridView添加新一行数据可添加到最后一行或第一行

    整体代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data; ...

  6. vue框架回顾

  7. linux 下安装django时出的错误

    解决方法 找到widgets.py 之后vim widgets.py 找到出错语句: 去掉末尾那个逗号即可.

  8. 十二、21.提交本地代码到Git仓库并推送到码云

    查看分支 运行git add . 把所有修改过后文件添加到暂存区 git commit 把当前所有的代码提交到rights分支 加-m加一个消息 到此所有的功能模块都已经提交到了rights这个分支里 ...

  9. JavaSE——.replace()方法替换内容

    package com.zhao.stringtest; public class Test5 { //.replace()方法替换词汇 public static void main(String[ ...

  10. 图片上传 加水印 以及GDI基本画图

      上传图片并给所上传的图片添加水印 1 HttpPostedFile file = Context.Request.Files[0]; //有这个0说明一次只能上传一张 2 if (file.Con ...