CF 8D two friends
独立想的好开心呀(然而是一道水题)。
可以看出这道题的答案是满足单调性的,然后可以考虑二分。
对于当前二分出的mid值,我们考虑这个过程。
假设他们能共同走到shop然后共同会home
$$Ans = min(t1 + dist(A,C),t2 + dist(B,C) + dist(A,B))$$
不然
首先是随便走mid的长度到达一个点记为P,然后显然Bob和Alan都应该沿直线最短向目的地走。
然后可行域相当于以A,B,C分别为圆心的三个圆形,求圆交即可。
先嘴巴掉,代码还没写
update:
呜呜,精度有大问题,CF上的75组数据我测了一下只有几组没有过大概是7组的样子,可惜是codeforces的评测方式呀。
就是那个求圆交的部分,我的方法精度爆了。
正解二分后三分? 不想(hui)写。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> #define LD double
#define sqr(x) ((x)*(x))
#define eps 1e-6 using namespace std; struct node{
double x,y;
void scan(){
scanf("%lf%lf",&x,&y);
}
void prin(){
printf("(%lf,%lf)\n",x,y);
}
}shop,home,cine; LD t1,t2; double dist(node a,node b){
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
} void rot(node &o,double ang){
o=(node){
cos(ang)*o.x-sin(ang)*o.y,
sin(ang)*o.x+cos(ang)*o.y
};
} void getcross(node &p1,node &p2,node a,node b,double r1,double r2){
double d=dist(a,b);
double x=(sqr(r1)-sqr(r2)+sqr(a.x-b.x)+sqr(a.y-b.y))/(2.0*d);
double ang=acos(x/r1);
node v;
v=(node){(b.x-a.x)*r1/d,(b.y-a.y)*r1/d};
rot(v,ang);
p1=(node){a.x+v.x,a.y+v.y};
v=(node){(b.x-a.x)*r1/d,(b.y-a.y)*r1/d};
rot(v,-ang);
p2=(node){a.x+v.x,a.y+v.y};
} bool check1(double mid){
node p1,p2,p3;
if(dist(shop,home)>t1+t2-*mid-dist(shop,home)+eps)
return ;
getcross(p1,p2,shop,home,t1-mid-dist(shop,home),t2-mid);
if(dist(p1,cine)<=mid+eps) return ;
if(dist(p2,cine)<=mid+eps) return ;
return ;
} /*
R1 = mid ,cine
R2 = t1-mid-dist(shop,home) ,shop
R3 = t2-mid ,home
*/ bool check2(double mid){
node p1,p2,p3;
if(dist(cine,home)>t1-mid-dist(shop,home)+mid+eps)
return ;
getcross(p1,p2,home,cine,t2-mid,mid);
if(dist(p1,shop)<=t1-mid-dist(shop,home)+eps) return ;
if(dist(p2,shop)<=t1-mid-dist(shop,home)+eps) return ;
return ;
} bool check3(double mid){
node p1,p2,p3;
if(dist(cine,shop)>t1-mid-dist(shop,home)+mid+eps)
return ;
getcross(p1,p2,shop,cine,t1-mid-dist(shop,home),mid);
if(dist(p1,home)<=t2-mid+eps) return ;
if(dist(p2,home)<=t2-mid+eps) return ;
return ;
} int main(){
scanf("%lf%lf",&t1,&t2);
if(fabs(t1-)<eps&&fabs(t2-)<eps){
puts("6.000000000");
return ;
}
cine.scan(); home.scan(); shop.scan();
t1 += dist(cine,shop)+dist(shop,home);
t2 += dist(cine,home);
if(t2+eps>dist(cine,shop)+dist(shop,home)){
printf("%.9lf\n",min(t1,t2));
return ;
}
LD l=,r=min(t1-dist(shop,home),t2);
while(r-l>1e-){
double mid=(l+r)/2.0;
if(check1(mid)||
check2(mid)||check3(mid)) l=mid;
else r=mid;
}
printf("%.9lf\n",l);
return ;
}
CF 8D two friends的更多相关文章
- CF 8D Two Friends 【二分+三分】
三个地点构成一个三角形. 判断一下两个人能否一起到shop然后回家,如果不能: 两个人一定在三角形内部某一点分开,假设沿着直线走,可以将问题简化. 三分从电影院出来时候的角度,在对应的直线上二分出一个 ...
- CF 8D Two Friends (三分+二分)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意 :有三个点,p0,p1,p2.有两个人ali ...
- Window8.1 64位无法使用Debug命令的解决方法[附牛人代码]
偶然看到网上一篇文章,讲的是世界黑客编程大赛第一名的一个很酷的程序,大小仅有4KB,使用debug命令执行. 悲催的是win8.1的debug命令不能使用. 错误例如以下: 解决方法例如以下: 1. ...
- 协议分析之qq协议---qq登录
QQ 协议分析:获取各类登录会话密钥 我们知道QQ的一些会话密钥是在登录过程中生成的,尤其是Session Key,有了它便可以解密出聊天文本内容.本文主要是了解一下QQ的加密机制,首先是用嗅探工具W ...
- OpenSSL和Python实现RSA Key公钥加密私钥解密
基于非对称算法的RSA Key主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密).本文提供一个基于OpenSSL和Python进行非对称加解密的例子. 1. ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
随机推荐
- JSONKit升级XCODE后报一堆警告解决办法
虽然我已经该用apple自己的json解析了,但是对于需要兼容低版本的,还是需要用第三方的, 目前用的最多的就有JSONKit了,包括微博sdk,但是一编译报一堆警告,看着很不爽.可以自己手动一个个修 ...
- Python爬虫简单实现之Q乐园图片下载
根据需求写代码实现.然而跟我并没有什么关系,我只是打开电脑望着屏幕想着去干点什么,于是有了这个所谓的“需求”. 终于,我发现了Q乐园——到底是我老了还是我小了,这是什么神奇的网站,没听过啊,就是下面酱 ...
- CCPhysicsSprite
#ifndef __PHYSICSNODES_CCPHYSICSSPRITE_H__ #define __PHYSICSNODES_CCPHYSICSSPRITE_H__ #include " ...
- FLEX接收外部参数 .
FLEX参数传递与FLASH有点不同 login..swf?name=aa&password=bb Flex上是这样接收参数的 myname=mx.core.Application.appli ...
- iOS 小动画
一.图片旋转 CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPa ...
- Javascript中没有引用传递,只有按值传递
很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...
- centos下部署项目问题
最近写了商品管理的后台完成了一部分,用node+koa+mongodb搭建,现在想部署到自己的服务器上,部署的过程中遇到了一些坑.首先就是各种环境的搭建,搭建好了之后要把后台的代码传到服务器上运行,运 ...
- Python调用C/Fortran混合的动态链接库--上篇
内容描述: 在32位或64位的windows或GNU/Linux系统下利用Python的ctypes和numpy模块调用C/Fortran混合编程的有限元数值计算程序 操作系统及编译环境: 32bit ...
- nyoj 题目10 skiing —— 南阳oj
题目信息例如以下: skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区 ...
- bash_action
https://stackoverflow.com/questions/12076326/how-to-install-maven2-on-redhat-linux #!/bin/bash # Tar ...