旅行家的预算(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( ...
随机推荐
- JavaScript中判断null、undefined与NaN的方法
1.判断undefined: ? 1 2 3 4 var tmp = undefined; if (typeof(tmp) == "undefined"){ alert(" ...
- 在 MySQL 中创建一个中文数据库
安装完 MySQL 后,要修改密码. step 1: SET PASSWORD = PASSWORD('your new password'); step 2: ALTER USER 'root'@' ...
- vue中使用全局函数
方法一: 在mian.js中写入函数: Vue.prototype.bb = function () { alert('OK'); } 然后在任何组件中都可以调用: this.bb() ...
- poj3279(枚举)
题目链接:https://vjudge.net/contest/294982#problem/C 题意:给定由0,1组成的m*n型矩阵,每次翻转一个结点会顺带翻转与其相邻的结点,问将矩阵翻转为全0的最 ...
- poj2635(千进制取模+同余模定理)
题目链接:https://www.cnblogs.com/kuangbin/archive/2012/04/01/2429463.html 题意:给出大数s (s<=10100) ,L (< ...
- JS函数入门
一. 函数的声明及调用 * 1函数的格式:function 函数名(参数1,参数2......){ * //函数体 * return 结果: * * } * 函数调用的格式: * 直接调用:函数名(参 ...
- 10-okHttp的同步与异步
我的理解如下: 同步: 实时的在等待返回结果: 异步:可以不是同步执行的,放入到执行队列中. 所以建议:如果需要根绝请求的结构做些判断应当用 同步,异步可能由于时间先后出现问题. /*post异步请求 ...
- golang语言中os/signal包的学习与使用
package main; import ( "os" "os/signal" "fmt" ) //signal包中提供了两个函数 //No ...
- Django模板如何用一个变量查找字典值
mydict = {"key1":"value1", "key2":"value2"} 在Django模板中查找字典值的 ...
- IIS7.0上传在大小限制
修改 IIS7的上传文件大小限制的方法: 1.打开IIS管理器,并定位于想要修改限制的网站 2.双击右侧窗口中的asp图标 3.展开最下面那个“限制属性”,将最下面的“最大请求实体主体限制”右边属性框 ...