Codeforces Round #327 590B Chip 'n Dale Rescue Rangers(等效转换,二分)
t和可到达具有单调性,二分就不多说了。下面说下O(1)的做法,实际上是等效转换,因为答案一定存在,如果在t0之前,那么分解一下
直接按照只有v计算就可以了。反过来如果计算的结果大于t0,那么表示答案在t0之后。因为速度分量是可以独立累加的,因此
可以找到一开始就只有w的等效的点。
#include<bits/stdc++.h> using namespace std; double x[2], y[2]; double vm, t0; double v[2], w[2]; const double eps = 1e-11; double dex, dey, D; bool unitization(double &dx = dex, double &dy = dey) { D = hypot(dx, dy); if(D > eps){ dx /= D; dy /= D; return true; } return false; } inline double Dot(double vx, double vy) { return dex*vx + dey*vy; } inline double Cross(double vx, double vy) { return dex*vy - dey*vx; } inline double MinTime(double x0, double y0, double vx, double vy, double x1 = x[1], double y1 = y[1]) { dex = x1-x0; dey = y1-y0; if(!unitization()) return 0; double vh = Cross(vx,vy); double vn = Dot(vx,vy); double vc = vn + sqrt(vm*vm - vh*vh); return D/vc; } //#define LOCAL int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif scanf("%lf%lf%lf%lf", x, y, x+1, y+1); scanf("%lf%lf", &vm, &t0); scanf("%lf%lf%lf%lf", v, v+1, w, w+1); double t = MinTime(x[0], y[0], v[0], v[1]); if(t0 >= t){ printf("%.18lf\n",t); }else { printf("%.18lf\n", MinTime(x[0]+(v[0]-w[0])*t0, y[0]+(v[1]-w[1])*t0, w[0], w[1])); } return 0; }
分类:
codeforces
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥