题目描述

名歌手LAALA最近迷上了一款赛车游戏,游戏中开车的玩家在不同的路段需要选择不同的速度,使得自己在最短的时间内到达终点。开始游戏时,车内的初始油量为f,所以游戏的关键是如何在速度和耗油量之间实现平衡。

LAALA 经过一段时间的研究后,发现这款游戏可以用一个简单的数学模型来描述,具体来说:从起点到终点的路线可以被简化成折线段,每条线段代表一个上坡或者下坡,若在一段斜率为 s(s>0 代表上坡,s=0 代表平地,s<0 代表下坡)的道路上以速度 v km/h 行驶,则每公里的耗油量为 max(0,av+bs),其中 a 和 b 为游戏的内置参数,分别表示在平地行驶时的耗油率及斜坡对耗油量的影响(b 恒为正)。这里假设,加速和减速不耗油,且看成是瞬间完成的,所以即使在同一条线段上也可采取以不同的速度行驶的策略来缩短耗费的时间。

由于 LAALA 在以前的游戏中表现不佳,现在使用的车型依然是系统初始分配的,所以它的速度不能超过 vmax km/h。在获得这些参数后,LAALA 想知道在初始油量受限的情况下(中途不许加油)自己能得到的最佳成绩是多少。作为 LAALA 的歌迷,你能帮帮他吗?

输入输出格式

输入格式:

从文件input.txt中读入数据,输入文件的第一行是一个正整数T,表示数据组数。对每组数据,第一行是用空格隔开的4个浮点数a、b、vmax和f,其中a、b和vmax的意义如前所述,f表示初始油量,其单位也与前面的描述保持一致。第二行是一个正整数r,表示线段的数目。接下来的r行,每行是用空格隔开的2个浮点数xi和yi,分别表示在标准笛卡耳坐标系下该线段在水平方向和垂直方向的改变量(单位为米)。

输出格式:

输出文件 output.txt 包含 T 行,依次对应输入中的 T 组数据。对某组数据,若基于初始油量无法到达终点,则对应行输出 IMPOSSIBLE,否则输出最少需要的时间(单位为小时)。

输入输出样例

输入样例#1:
复制

3
10.0 1.0 150 0.0
1
100.0 -100.0
10.0100.0 150 1.0
2
1000
100100
0.50.110010
3
1000 0
100 10
100 -10
输出样例#1: 复制

1.41421
IMPOSSIBLE
0.07212

说明

【数据范围】

100%的数据满足 T≤100,0.1≤a≤100,0.1≤b≤100,10≤vmax≤200,0≤f≤50,r≤10000,1≤xi≤1000,-1000≤yi≤1000,且如果问题有解,那么答案不超过 24。

你所输出的答案需要恰好保留到小数点后 5 位,当且仅当你的输出与标准答案完全一致时你的输出才被视作正确。

在油耗中,b*k是定值,a*v在确定了v后也确定

那么根据题意,在不考虑下坡的特殊性的情况下

速度越大,时间越少,油耗越接近f

此时$a*v=f-\sum_{i=1}^{n}b*k[i]$

但此时考虑下坡,因为对0取max

原本下坡油耗计算为负的变成0,也就是上式算出的v的油耗>f

单独把油耗为负下坡称作zyys坡

把zyys坡的v把变小没用,因为总是0,所以只能减小其它坡的v,把zyys多出的油耗分走

因为zyys坡无论减不减小都是0,所以可以视为v

所以可以二分速度v,看是否满足油量

在计算时间时要把zyys坡的速度取到油耗为0的最大临界值:

当$a*v+b*k<=0$时,速度还可以往上提到临界$min(vmax,-b*k/a)$

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
double eps=1e-;
double a,b,y[],x[],f,vmax,k[],l[];
int n,T;
int fcmp(double x)
{
if (x>eps) return ;
if (x<-eps) return -;
return ;
}
bool check(double mid)
{int i;
double sum=;
for (i=;i<=n;i++)
{
sum+=max(0.0,mid*a+k[i]*b)*l[i];
if (fcmp(sum-f)>) return ;
}
if (fcmp(sum-f)<=) return ;
return ;
}
double cal(double mid)
{int i;
double tim=;
if (mid<=eps) return ;
for (i=;i<=n;i++)
{
double tmp=a*mid+b*k[i];
if (tmp<=eps)
{
double v=min(vmax,-b*k[i]/a);
tim+=l[i]/v;
}
else
tim+=l[i]/mid;
}
return tim;
}
int main()
{int i;
cin>>T;
while (T--)
{
scanf("%lf%lf%lf%lf",&a,&b,&vmax,&f);
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
x[i]/=1000.0;
y[i]/=1000.0;
k[i]=y[i]/x[i];
l[i]=sqrt(y[i]*y[i]+x[i]*x[i]);
}
double l=,r=vmax,as=,t=;
while (t<=)
{
t++;
double mid=(l+r)/2.0;
if (check(mid)) l=mid;
else r=mid;
}
as=cal(l);
if (as<=eps) printf("IMPOSSIBLE\n");
else printf("%.5lf\n",as);
}
}

[HNOI2011]赛车游戏的更多相关文章

  1. 【BZOJ2328】 [HNOI2011]赛车游戏

    BZOJ2328 [HNOI2011]赛车游戏 前言 这道题目我真的佛了,卡精度+卡时间这就是下一个聊天鬼才. Solution 首先可以二分出最大速度,然后考虑下坡的话可能有更好的解,然后这样子算一 ...

  2. BZOJ2328: [HNOI2011]赛车游戏

    BZOJ2328: [HNOI2011]赛车游戏 Description 题解Here! 一开始被题面那一长串的描述吓到了,一直没敢做... 然后尝试着硬着头皮读懂题面. 然后...这不是贪心么??? ...

  3. 2328: [HNOI2011]赛车游戏 - BZOJ

    先把一定要减的费用先减掉,就是b*s*len(上坡路),下坡路就设一个初速度,使耗油为0,如果没油了,就无法到达 然后考虑加速 对于长度为len的路,增加v的速度需要len*a*v的油,与len成正比 ...

  4. 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景

    最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...

  5. Unity赛车游戏之移动

    这个赛车游戏真是让我费劲脑汁啊.尤其是写这种系统化的东西. 目前漂移还没找到更好的算法,不过基本的移动还是可以做到的. 别看就光是个移动,其实也是很费事的. Unity给了个对于赛车系统很好的碰撞组件 ...

  6. 使用Unity3D引擎开发赛车游戏

    Car Tutorial 在Unity3D的Asset Store有一个赛车的Demo —— Car Tutorial,看起来特别酷的赛车游戏Demo,不过我还没有下载下来,因为在公司下载Assets ...

  7. unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算

    接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...

  8. unity3d 赛车游戏——复位点检测

    一直没有时间写博客 昨天我的CarWaypoints插件也告一段落了 今年没回家,过年就我一个人 挺无聊的,那就休息一天写几篇博客吧 我的代码可能很少,但是思路很重要 希望不懂的朋友别只copy代码 ...

  9. 一款c语言实现的赛车游戏

    博主学习c语言已经有一段时间了,出于对自己学习检验的目的,自制了一款c语言赛车游戏. 由于本质是检验和尝试,所以并没有注重游戏的界面.下文是开发文档,在博主的github网页可以下载源码,注意本项目使 ...

随机推荐

  1. 结合jenkins在Linux服务器搭建测试环境

    何时使用: 测试过程中我们需要持续构建一个软件项目,为避免重复的手动下载.解压操作,我们需要搭建一个能够自动构建的测试环境,当代码有更新时,测试人员只需点一下[构建]即可拉取最新的代码进行测试(也可设 ...

  2. 201621123050 《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.抽象.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选:使用常规方法 ...

  3. Linux下Java通用安装方法

    1.到oracle官网下下载对应jdk包,一般为%x64%.tar.gz格式. 2.建立目录: $ mkdir /usr/local/java 3.将压缩包解压至/usr/local/java 4.修 ...

  4. SQL的介绍及MySQL的安装

    基础篇 - SQL 介绍及 MySQL 安装               SQL的介绍及MySQL的安装 课程介绍 本课程为实验楼提供的 MySQL 实验教程,所有的步骤都在实验楼在线实验环境中完成, ...

  5. Flask学习 一 基本结构

    -from flask import Flask +from flask import Flask,render_template -from flask import request -from f ...

  6. zookeeper入门系列:概述

    zookeeper可谓是目前使用最广泛的分布式组件了.其功能和职责单一,但却非常重要. 在现今这个年代,介绍zookeeper的书和文章可谓多如牛毛,本人不才,试图通过自己的理解来介绍zookeepe ...

  7. JAVA_SE基础——19.数组的定义

    数组是一组相关数据的集合,数组按照使用可以分为一维数组.二维数组.多维数组 本章先讲一维数组 不同点: 不使用数组定义100个整形变量:int1,int2,int3;;;;;; 使用数组定义 int ...

  8. 遍历JSON

    第一种: each,不做详细说明,太常用了 第二种:我用来遍历单个组,实现前端界面绑定 for(var item in person){ alert("person中"+item+ ...

  9. 区间的连续段~ST表(模板题)

    链接:https://www.nowcoder.com/acm/contest/82/B来源:牛客网 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他语言5242 ...

  10. JSON的简单书写(初学),使用Java语言反序列化

    这个适合初学者:刚刚我学习的 1.基础的"JSON"     对象是用一对大括号: 例如: {      "name":"xiaohua", ...