[NOIP1999 提高组] 旅行家的预算
洛咕
题意:一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 \(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 提高组] 旅行家的预算的更多相关文章
- NOIP1999提高组 题解报告
T1 导弹拦截 题目大意:依次有\(n\) (\(n \le 10^5\))枚导弹,一套导弹拦截系统只能拦截一系列高度递减的导弹(一套系统拦截的弹道不一定相邻).求一套系统最多能拦截多少导弹,以及最少 ...
- [NOIP1999] 提高组 洛谷P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- [NOIP1999] 提高组 洛谷P1014 Cantor表
题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...
- [NOIP2006] 提高组 洛谷P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 旅行家的预算(NOIP1999&水题测试2017082301)
题目链接:旅行家的预算 这题还可以,不算太水. 这题贪心即可. 我们采取如下动作: 如果在装满油的情况下能到达的范围内,没有加油站,则无解. 如果在装满油的情况下能到达的范围内,油价最低的加油站的油价 ...
- codevs 1046 旅行家的预算
传送门 1046 旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold题解 题目描述 Des ...
- $NOIp$提高组历年题目复习
写在前面 一个简略的\(NOIp\)题高组历年题目复习记录.大部分都有单独写题解,但懒得放\(link\)了\(QwQ\).对于想的时候兜了圈子的题打上\(*\). \(NOIp2018\ [4/6] ...
- NOIP 2015提高组复赛
神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第 ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 【二分查找】 跳石头NOIP2015提高组 D2T1
[二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...
随机推荐
- fastai fit_one_cycle AttributeError: 'function' object has no attribute 'parameters'
初学fastai fit_one_cycle语句报错指向614行, 即: return [p for p in m.parameters() if p.requires_grad] 在以前遇到这种 ...
- uniapp 提示 打包时未添加 push模块
最近打包上架的 ios项目 启动项目提示打包时未添加 push模块 在uniapp manifest中可以配置消息推送,可以我们项目没有用到这个功能,真是日狗了,排除半天仔细检查了使用Push ...
- 随机颜色,加载loading效果,节流,应用周期函数,wxs
随机颜色 data: { colorList:[] }, getColor(){ wx.request({ url: 'https://www.escook.cn/api/color', method ...
- #加IPV6路由
#加IPV6路由route -A inet6 add 2409:802f:6005:4204::31:0/123 gw 2409:805b:6005:4218::41f:1#路由写入网卡配置文件vi ...
- python命令行开发--click
目录 前言 安装 快速上手 参考文档 前言 按照官方的介绍:Click 是一个利用很少的代码以可组合的方式创造优雅命令行工具接口的 Python 库. 它是高度可配置的,但却有合理默认值的" ...
- java开发细节
Java开发细节 Java源文件以.java 为扩展名.源文件的基本组成部分为类(class),如本类中的Hello类 Java应用程序的执行入口是main()方法.它有固定的书写格式: public ...
- hexo-theme-tree
Hexo 主题 Tree 一个简洁的主题,主要功能是 "树状导航" + "树状目录",可选配"评论"和"阅读量"功能,支 ...
- Symbol类型
Symbol 是ES6引入的一种新的原始数据类型,由于Symbol是一个原始类型的值,不是对象,不能添加属性.基本上 是一种类似于字符串的数据类型 概述 Symbol 可以接受一个字符串作为参数,主要 ...
- xpath拉取链家二手房信息并保存到excel中
import os.path import requests from lxml import etree import xlwt import xlrd def create_excel(): if ...
- 查看当前linux进程所在的目录
1.通过 ps -ef | grep xxx 查看进程信息 ps -ef | grep rsi 1 2.通过 ll /proc/PID 命令查看进程所在目录位置 ls -l /proc/PID 1 L ...