BZOJ2328: [HNOI2011]赛车游戏
Description
题解Here!
从耗油量最少开始慢慢贪心地调整。
对于上坡,速度设为$0$,但是免不了耗油,这一部分的耗油先减掉。
对于下坡,速度在不耗油的前提下设到最大(但是不能超过$vmax$)。
对于平路,速度设为$0$。
然后我们用一个优先队列来维护这些线段,每次取出速度最小的段,如果它的速度和次小的速度一样就合并起来,否则将它的速度提升到和次小的速度一样。
当然这是在油够用的前提下,如果油不够用就提到能提到的最高速率。
这样做直到用光油或者都打到$vmax$时结束。
证明?$\tan(\frac{\pi}{2}+k\pi),k\in Z$。。。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#define eps (1e-8)
using namespace std;
int n;
double A,B,maxn,f;
bool flag;
struct node{
double oil,dis;
friend bool operator <(const node &p,const node &q){
return p.oil>q.oil;
}
};
priority_queue<node> q;
inline int check(double x){
if(fabs(x)<eps)return 0;
return (x>0?1:-1);
}
void work(){
if(!flag){
printf("IMPOSSIBLE\n");
while(!q.empty())q.pop();
return;
}
double w,ans=0;
node u,v;
q.push((node){maxn,0});
while(check(f)>0&&!q.empty()){
u=q.top();
q.pop();
v=q.top();
if(check(u.oil-maxn)==0)ans+=u.dis/u.oil;
else if(check(u.oil-v.oil)!=0){
w=f/(A*u.dis);
if(check(u.oil-v.oil+w)>=0){
w=v.oil-u.oil;
q.pop();
q.push((node){v.oil,u.dis+v.dis});
}
else{
u.oil+=w;
q.push(u);
}
f-=A*w*u.dis;
}
else{
q.pop();
q.push((node){v.oil,u.dis+v.dis});
}
}
while(!q.empty()){
u=q.top();
q.pop();
ans+=u.dis/u.oil;
}
printf("%.5lf\n",ans);
}
void init(){
double x,y,w,l;
scanf("%lf%lf%lf%lf%d",&A,&B,&maxn,&f,&n);
flag=true;
for(int i=1;i<=n;i++){
scanf("%lf%lf",&x,&y);
x/=1000.0;y/=1000.0;
w=y/x;
l=sqrt(x*x+y*y);
if(check(w)>0){
f-=w*B*l;
q.push((node){0,l});
if(check(f)<=0)flag=false;
}
else if(check(w)<0)q.push((node){min(-w*B/A,maxn),l});
else q.push((node){0,l});
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
init();
work();
}
return 0;
}
BZOJ2328: [HNOI2011]赛车游戏的更多相关文章
- 【BZOJ2328】 [HNOI2011]赛车游戏
BZOJ2328 [HNOI2011]赛车游戏 前言 这道题目我真的佛了,卡精度+卡时间这就是下一个聊天鬼才. Solution 首先可以二分出最大速度,然后考虑下坡的话可能有更好的解,然后这样子算一 ...
- [HNOI2011]赛车游戏
题目描述 名歌手LAALA最近迷上了一款赛车游戏,游戏中开车的玩家在不同的路段需要选择不同的速度,使得自己在最短的时间内到达终点.开始游戏时,车内的初始油量为f,所以游戏的关键是如何在速度和耗油量之间 ...
- 2328: [HNOI2011]赛车游戏 - BZOJ
先把一定要减的费用先减掉,就是b*s*len(上坡路),下坡路就设一个初速度,使耗油为0,如果没油了,就无法到达 然后考虑加速 对于长度为len的路,增加v的速度需要len*a*v的油,与len成正比 ...
- 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...
- Unity赛车游戏之移动
这个赛车游戏真是让我费劲脑汁啊.尤其是写这种系统化的东西. 目前漂移还没找到更好的算法,不过基本的移动还是可以做到的. 别看就光是个移动,其实也是很费事的. Unity给了个对于赛车系统很好的碰撞组件 ...
- 使用Unity3D引擎开发赛车游戏
Car Tutorial 在Unity3D的Asset Store有一个赛车的Demo —— Car Tutorial,看起来特别酷的赛车游戏Demo,不过我还没有下载下来,因为在公司下载Assets ...
- unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算
接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...
- unity3d 赛车游戏——复位点检测
一直没有时间写博客 昨天我的CarWaypoints插件也告一段落了 今年没回家,过年就我一个人 挺无聊的,那就休息一天写几篇博客吧 我的代码可能很少,但是思路很重要 希望不懂的朋友别只copy代码 ...
- 一款c语言实现的赛车游戏
博主学习c语言已经有一段时间了,出于对自己学习检验的目的,自制了一款c语言赛车游戏. 由于本质是检验和尝试,所以并没有注重游戏的界面.下文是开发文档,在博主的github网页可以下载源码,注意本项目使 ...
随机推荐
- Java线程池ThreadPoolExecutor类源码分析
前面我们在java线程池ThreadPoolExecutor类使用详解中对ThreadPoolExector线程池类的使用进行了详细阐述,这篇文章我们对其具体的源码进行一下分析和总结: 首先我们看下T ...
- 【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别
@SpringCloudApplication和@SpringBootApplication的区别
- eos wasm虚拟机相关接口定义实现
wasm虚拟机相关接口定义实现 执行流程 controller::push_transaction() // 事务 -> transaction_context::exec() // 事务 ...
- 报错:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 1>
这段时间忙于看文献,没用过VS了. 今天用着用着就报错了: LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 1> 问度娘,大神给出了解决方法 ...
- Data Leakage 因果性
参考这篇: https://blog.csdn.net/jiandanjinxin/article/details/54633475 再论数据科学竞赛中的Data Leakage 存在和利用这种倒‘因 ...
- 算法之美--1.蒙特卡洛方法计算pi
基本思想: 利用圆与其外接正方形面积之比为pi/4的关系,通过产生大量均匀分布的二维点,计算落在单位圆和单位正方形的数量之比再乘以4便得到pi的近似值.样本点越多,计算出的数据将会越接近真识的pi(前 ...
- linux暴力密码破解工具hydra安装与使用
说明:hydra是著名黑客组织thc的一款开源的暴力密码破解工具,可以在线破解多种密码.官网:http://www.thc.org/thc-hydra,可支持AFP, Cisco AAA, Cisco ...
- linux 之体验(JDK7+Tomcat7+MySQL5.5)部署环境
---------------------------------------------------------------------------------------------------- ...
- c语言字符数组的初始化问题
1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...
- (四)DOM对象和jQuery对象
学习jQuery,需要搞清楚DOM对象和jQuery对象的关系与区别,因为两者的方法并不共用,如果搞不清楚对象类型就会导致调用错误的方法. DOM(Document Object Model)称为文档 ...