旅行家的预算(NOIP1999&水题测试2017082301)
题目链接:旅行家的预算
这题还可以,不算太水。
这题贪心即可。
我们采取如下动作:
- 如果在装满油的情况下能到达的范围内,没有加油站,则无解。
- 如果在装满油的情况下能到达的范围内,油价最低的加油站的油价比当前高,那就装满油再走。
- 如果在装满油的情况下能到达的范围内,油价最低的加油站的油价比当前低,我们使油够到达那个加油站即可,如果当前的油比需要的多,我们分两种情况考虑:第一,这个最低油价比上一个加油的站价格高,那么我们就直接过去;第二,这个最低油价比上一站油价低,那么我们把多余的油退回上一个加油站(没错,就是有这种操作)。
- 如果能到达终点,我们依然要考虑两种情况:第一,就是最低油价比当前站油价低,那就执行3;第二,如果最低油价比当前站油价高,那就直接过去,并判断油是否多余,多余就退。
有了这几点,我们就可以写出程序了。
#include<bits/stdc++.h>
using namespace std;
int main(){
int reachable=1;
double d1,c,d2,P;
int n;
scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&P,&n);
double d[n+2],p[n+2];
double ans=0.0;
double liter=0.0; //1
int laststop=0; //2
d[n+1]=d1,p[n+1]=0; //3
d[0]=0,p[0]=P;
for(int i=1;i<=n;i++){
scanf("%lf%lf",&d[i],&p[i]);
}
double maxgo=c*d2; //4
for(int i=0;i<n+1;){
double min=1000000000.0;
int x=-1;
int ok=0;
for(int j=i+1;j<=n+1&&d[j]-d[i]<=maxgo;j++){//5
if(j==n+1){
ok=1;
}else if(p[j]<min){
min=p[j];
x=j;
}
}
if(ok==1&&min>=p[i]){
double need=(d[n+1]-d[i])/d2;
if(liter<need){
ans+=(need-liter)*p[i];
}else{
ans-=(need-liter)*p[laststop];
}
liter=0;
laststop=i;
i=n+1;
}else if(x>=0){
if(min>p[i]){
double need=c-liter;
ans+=need*p[i];
liter=c-(d[x]-d[i])/d2;
}else{
double need=(d[x]-d[i])/d2;
if(need>liter){
ans+=(need-liter)*p[i];
liter=0;
}else{
if(p[x]<p[laststop]){
ans-=(need-liter)*p[laststop];
liter=0;
}else{
liter-=need;
}
}
}
laststop=i;
i=x;
}else{
reachable=0;
break;
}
}
if(reachable){
printf("%.2f",ans);
}else{
printf("No Solution");
}
return 0;
}
就提五处:
1处:保存当前油量
2处:保存上一站
3处:我们这里视起点为第0站,终点为第n+1站。
4处:计算满油能跑的路程
5处:求最小值
旅行家的预算(NOIP1999&水题测试2017082301)的更多相关文章
- NOIP水题测试(2017082301)
你们从题目也能看出来今天的题是很水的. 前几期答案还没出,效率有点低,谅解,谅解. 今天的答案应该会出的很快. 下面给题目: 时间限制:3小时 题目一:旅行家的预算 题目二:进制转换 题目三:乘积最大 ...
- 失踪的7(P1590&NOIP水题测试(2017082301))
题目链接:失踪的7 水题,不解释. #include<bits/stdc++.h> using namespace std; int main(){ int t; scanf(" ...
- 子数整数(P1151&NOIP水题测试(2017082301))
题目链接:子数整数 水题,不解释,自己看代码: #include<bits/stdc++.h> using namespace std; int main(){ int k; scanf( ...
- 进制转换(NOIP2000&NOIP水题测试(2017082301))
题目链接:进制转换 这题得明白其中的数学方法,明白后就不难了. 那么我们应该怎么计算呢? 其实也很简单. 我们依然采取辗转相除法. 但是,对于负的余数,我们需要进行一些处理. 我们怎么处理呢? 很简单 ...
- 求先序排列(NOIP2001&NOIP水题测试(2017082301))
题目链接:求先序排列 这道题讲白了,就是数的构造,然后遍历. 思路大致是这样: 我们先通过后序遍历,找到当前区间的根,然后在中序遍历中找到根对应的下标,然后就可以分出左右子树,建立当前根与左右子树根的 ...
- 乘积最大(NOIP2000&NOIP水题测试(2017082301))
题目链接:乘积最大 这道题显然是道区间dp. 难度不是很大. 思路也很清晰. 我们设计一个三维状态. ans[l][r][k] 这里表示在闭区间[l,r]上操作k次的最大值. 操作就是加乘号. 转移也 ...
- NOIP水题测试(2017082401)
哈,水题测试又来了! 上次的水题简单吧! 答案是以单题形式发布的(旅行家的预算随后发布). 下面来看今天的题,还是水题. 时间限制:5小时 题目一:看上去就很水 题目二:比上面一题还水 题目三:数的划 ...
- NOIP水题测试(2017082501)
日常水题测试又来了! 以后答案都以单题形式公布. 下面看今天的水题: 时间限制:5小时 题目一:无法形容的水 题目二:比上一题还水 题目三:一元三次方程求解 题目四:单词接龙 题目五:统计单词个数 题 ...
- 栈(NOIP2003&水题测试2017082501)
题目链接:栈 这题不难. 我们看一下,其实可以发现是卡特兰数. 不知道卡特兰数?没事,给你简单讲一下. 卡特兰数的递推式f(n)=f(0)*f(n-1)+f(1)*f(n-2)+-+f(n-2)*f( ...
随机推荐
- harbor在centos7.4下面配置自签名证书(域名是端口映射)
1.harbor安装,按常规安装. 注意事项,端口映射 端口要外网的与内网一至. 配置文件修改 vim docker-compose.yml proxy: image: vmware/nginx-ph ...
- 第十章 优先级队列 (b1)完全二叉堆:结构
- cisco 交换机通过console 导入 IOS
准备说明: 电脑上安装有 SecureCRT 软件 导入 IOS: 第一步:使用 SecureCRT 连接上交换机.进入rommon 模式(Ctrl+Break组合键) 第二部:设置波特率为11520 ...
- stark组件之路由分发【模仿Django的admin】
一.先看下django的admin是如何进行路由分发的 1.先看下django的admin的url路径有哪些 其实很简单,假如有一个书籍表,那么每张表对应四个url,增.删.改.查 查看的url ht ...
- json的内容回顾
复习一下json这个模块 import json s = '{"name":"cui","age":12}' # 这里外部必须是单引号,内部 ...
- undefined reference to...
wj@wj-Inspiron-:~/Downloads/LBD_Descriptor/build$ cmake .. -- Configuring done -- Generating done -- ...
- netcore sqlserver linq contains生成的sql语句不是使用like而是charIndex
在ef中使用linq调用了contains,结果怎么都查不到值,打开sqlserver profiler 发现生成的sql语句不是使用like...而是CharIndex 参考文档:https://s ...
- u-boot之NAND启动与NOR启动的区别
nand启动与nor启动的区别主要分为以下几部分说明: 1.nand flash与nor flash的最主要区别 2.s3c2440的nand启动与nor启动原理 3.nand启动与nor启动的时候u ...
- hdu 2647 (拓扑排序 邻接表建图的模板) Reward
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...
- Numpy array分割
1.纵向分割 >>> import numpy as np >>> A = np.arange(12).reshape((3, 4)) >>> p ...