题目传送门(以纪念调了两个半小时的单调队列)


emmm这题单调队列可海星...

因为每个点有油量无限的,但是油箱容量是有限的(正好反的一道题 SP348 EXPEDI - Expedition

所以我们可以用一个价格递减单调队列来记录已加过油的加油站

若要行驶到一个新的加油站时,弹出对头,直到油量可以支撑到这个加油站,然后判断到没到终点,再然后弹出对尾,直到对尾的价格小于这个加油站的价格(之前的状态都可以去掉,因为每个加油站油量是无限的,你在开头就已经判断了,就算你到了这个加油站油箱空了,你也可以到下一个加油站)(就是某ddy dalao说的贪心反悔),最后把这个点的价格,和可以加的油量插入队尾

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define R register int
#define db double
using namespace std;
int n;
db d1,C,d2,d[],p[],ans,crt;
char ch;
struct node{
db p,c;//p代表价格,c代表在油箱还剩下的冗余油量
node(db pi,db ci): p(pi),c(ci) {}
};
deque<node> q; inline int lf()
{
R ret=,fix=;
while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=(ret<<)+(ret<<)+ch-''; while(isdigit(ch=getchar()));
return ret*fix;
} inline double g()
{
double ret=lf(),d=;
if(ch=='.') while(isdigit(ch=getchar())) ret+=(ch^)/(d*);
return ret;
} signed main()
{
//d1=g(),C=g(),d2=g(),p[0]=g(),n=g();
scanf("%lf%lf%lf%lf%d", &d1, &C, &d2, &p[], &n);//scanf保平安(哪位大佬看出我快读的问题麻烦指明一下QAQ(加快读只过了两个点))
for(R i=;i<=n;i++) {scanf("%lf%lf",&d[i],&p[i]); if(d[i]-d[i-]>C*d2) {printf("No Solution"); return ;}}
    //如果油箱加满,都不能到下一个加油站,那就无解
d[n+]=d1;crt=C;//在起点加满油
q.push_back(node(p[],C));
ans+=p[]*C;//在起点加满油
for(R i=;i<=n+;i++)
{
db drt=(d[i]-d[i-])/d2;//当前经过[d[i-1],d[i]]所需油量
while(!q.empty()&&drt>)
{
node front=q.front();q.pop_front();
if(front.c>drt) {crt-=drt; q.push_front(node(front.p,front.c-drt)); break;}
        //弹队头:当一个位置已经没有冗余的油量时,就弹掉。
crt-=front.c,drt-=front.c;
}
if(i==n+)
{
while(!q.empty()) ans-=q.front().p*q.front().c,q.pop_front();
break;
}
while(!q.empty()&&q.back().p>p[i])
ans-=q.back().c*q.back().p,crt-=q.back().c,q.pop_back();
ans+=(C-crt)*p[i];
q.push_back(node(p[i],C-crt));
crt=C;
}
printf("%.2lf\n",ans);
}

如有错误,恳请您指正(我太菜了);如有不理解,可留言,我会尽量回复。。。(高中生(逃)。。)

by Jackpei 2019.2.27

题解 P1016 旅行家的预算的更多相关文章

  1. 洛谷 P1016 旅行家的预算

    P1016 旅行家的预算 题目OJ链接https://www.luogu.org/problemnew/show/P1016 题目描述一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时 ...

  2. P1016 旅行家的预算

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

  3. P1016 旅行家的预算——贪心

    P1016 旅行家的预算 贪心求,在当前点如果能到达距离最近的油价比他小的就直接去油价比他小的, 如果在可行范围内没有比他油价小的,就加满开到可行范围内油价最小的点: 这么做是对的,我不会证明: 还有 ...

  4. [luogu]P1016 旅行家的预算[贪心]

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

  5. 洛谷 P1016 旅行家的预算 模拟+贪心

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车 ...

  6. 洛谷P1016 旅行家的预算 题解

    主要就是注意一下各个变量的类型别弄混了 https://www.luogu.org/problem/P1016 #include<cstdio> using namespace std; ...

  7. luogu P1016 旅行家的预算

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

  8. 洛谷P1016 旅行家的预算

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

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

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

随机推荐

  1. 【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP

    题意 给定$n$个点$m$条边有向图及边权$w$,第$i$次经过一条边边权为$w-1-2.-..-i$,$w\ge 0$给定起点$s$问从起点出发最多能够得到权和,某条边可重复经过 有向图能够重复经过 ...

  2. listen 66

    Frog Species Found in Big Apple Scientists discover new species all the time—on the order of 15,000 ...

  3. selenium 经常用到的API

    一.webdriver 属性及方法: 1.获取当前页面的 url driver.current_url 2 .获取窗口相关信息 get_window_position() 返回窗口x,y坐标 get_ ...

  4. hdu-5792 World is Exploding(容斥+树状数组)

    题目链接: World is Exploding Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Jav ...

  5. linux命令学习笔记(33):df 命令

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了 多少空间,目前还剩下多少空间等信息. .命令格式: df [选项] [文件] .命令 ...

  6. C++中两个类相互包含引用问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...

  7. bjwc Day0 大型签到日

    1.18期末考试 1.19试卷讲评 1.20我开始了bjwc愉快的冬眠之旅 上午先是颁发noip一等奖 我在台下笑得像个没有一等奖的孩子/手动微笑 然后去机房试了一下机 坐在鸡神边上,键盘竟然是坏的, ...

  8. forEach、for in 和for of的区别

    forEach  不能使用break return 结束并退出循环 for in 和 for of 可以使用break return: for in遍历的是数组的索引(即键名),而for of遍历的是 ...

  9. 数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)

    意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名称 ...

  10. bzoj 1119 [POI2009] SLO & bzoj 1697 牛排序 —— 置换+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119 https://www.lydsy.com/JudgeOnline/problem.p ...