转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove

题意 :有三个点,p0,p1,p2。有两个人alice,bob,他们初始位置为p0,现在 alice需要先到p2再到p1,bob是直接到p1。设计一条线路,使得他们初始一起走的路程尽可能地长(之后相遇不算)。要求alice走的路程和最短路之差不超过t1,bob不超过t2。

http://codeforces.com/contest/8/problem/D

题目看的一头雾水。

可以证明出最优的分离点肯定是在p0,p1,p2组成的三角形之间。

因此可以求出p0出发的角度,一旦角度确定,能走的最远路程可以通过二分求得。

同时发现当角度左右偏离,那么都只会有利于某一方,所以三分角度,二分距离。

角度可以三分p1,p2上的点。

另外还要注意一些特殊情况,如bob先到p2再到p1。沿着p1,p2行走等情况。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <ctime>
#define lson step<<1
#define rson step<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define pii pair<int,int>
using namespace std;
typedef long long LL;
struct Point{
double x,y;
Point(){}
Point(double _x,double _y):x(_x),y(_y){}
void input(){
scanf("%lf%lf",&x,&y);
}
}p0,p1,p2;
double t1,t2;
double sqr(double a){
return a*a;
}
double dist(Point p1,Point p2){
return sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y));
}
// s->e , p at the line of s->m , s->p + p->e <= t + s->e
double solve(Point s,Point e,Point m,double t){
if(dist(s,m)+dist(m,e)<=t+dist(s,e))
return dist(s,e)+t-dist(m,e);
double low=0.0,high=1.0,mid;
for(int step=1;step<=1000;step++){
mid=(low+high)/2.0;
Point p=Point(s.x+mid*(m.x-s.x),s.y+mid*(m.y-s.y));
if(dist(s,p)+dist(p,e)<=t+dist(s,e)) low=mid;
else high=mid;
}
return mid*dist(s,m);
}
int main(){
scanf("%lf%lf",&t1,&t2);
p0.input();p1.input();p2.input();
double low=0.0,high=1.0,mid,midd,ans=0.0;
ans=max(ans,min(solve(p0,p1,p1,t2),solve(p0,p2,p1,t1)));
ans=max(ans,min(solve(p0,p1,p2,t2),solve(p0,p2,p2,t1)));
if(dist(p0,p2)+dist(p2,p1)<=t2+dist(p0,p1)){
ans=max(ans,min(dist(p0,p1)+t2,dist(p0,p2)+dist(p2,p1)+t1));
}
for(int step=1;step<=1000;step++){
mid=low+(high-low)/3.0;
midd=high-(high-low)/3.0;
Point pa=Point(p1.x+(p2.x-p1.x)*mid,p1.y+(p2.y-p1.y)*mid);
Point pb=Point(p1.x+(p2.x-p1.x)*midd,p1.y+(p2.y-p1.y)*midd);
double r1=min(solve(p0,p1,pa,t2),solve(p0,p2,pa,t1));
double r2=min(solve(p0,p1,pb,t2),solve(p0,p2,pb,t1));
if(r1>r2) high=midd,ans=max(ans,r1);
else low=mid,ans=max(ans,r2);
}
printf("%.10f\n",ans);
return 0;
}

CF 8D Two Friends (三分+二分)的更多相关文章

  1. CF 8D Two Friends 【二分+三分】

    三个地点构成一个三角形. 判断一下两个人能否一起到shop然后回家,如果不能: 两个人一定在三角形内部某一点分开,假设沿着直线走,可以将问题简化. 三分从电影院出来时候的角度,在对应的直线上二分出一个 ...

  2. Codeforces 8D Two Friends 三分+二分+计算几何

    题目链接:点击打开链接 题意:点击打开链接 三分house到shop的距离,二分这条斜边到cinema的距离 #include<stdio.h> #include<string.h& ...

  3. HDU 2298 Toxophily(公式/三分+二分)

    Toxophily Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. CF 8D two friends

    独立想的好开心呀(然而是一道水题). 可以看出这道题的答案是满足单调性的,然后可以考虑二分. 对于当前二分出的mid值,我们考虑这个过程. 假设他们能共同走到shop然后共同会home $$Ans = ...

  5. Codeforces 939E Maximize ( 三分 || 二分 )

    题意 : 给出两个操作,① 往一个序列集合(初始为空)里面不降序地添加数字.② 找出当前序列集合的一个子集使得 (子集的最大元素) - (子集的平均数) 最大并且输出这个最大差值 分析 :  首先关注 ...

  6. HDU 4355 Party All the Time(三分|二分)

    题意:n个人,都要去參加活动,每一个人都有所在位置xi和Wi,每一个人没走S km,就会产生S^3*Wi的"不舒适度",求在何位置举办活动才干使全部人的"不舒适度&quo ...

  7. 洛谷 P3382 【模板】三分法(三分 二分)

    P3382 [模板]三分法 题目提供者HansBug 难度 普及/提高- 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. ...

  8. Toxophily HDU - 2298 三分+二分

    代码+解析: 1 //题意: 2 //有一个大炮在(0,0)位置,为你可不可以把炮弹射到(x,y)这个位置 3 //题目给你炮弹初始速度,让你求能不能找出来一个炮弹射出时角度满足题意 4 //题解: ...

  9. CF 672D Robin Hood(二分答案)

    D. Robin Hood time limit per test 1 second memory limit per test 256 megabytes input standard input ...

随机推荐

  1. Web调试利器fiddler使用

    fiddler官网:http://fiddler2.com/ http://wenku.baidu.com/view/053e79d776a20029bd642dc1 http://www.cnblo ...

  2. wiki oi 3115高精度练习之减法

    题目描述 Description 给出两个正整数A和B,计算A-B的值.保证A和B的位数不超过500位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Outpu ...

  3. 在Xcode中使用C++与Objective-C混编

    有时候,出于性能或可移植性的考虑,需要在iOS项目中使用到C++. 假设我们用C++写了下面的People类: // //  People.h //  MixedWithCppDemo // //   ...

  4. reason: 'unable to dequeue a cell with identifier Cell

    今天在cell重用的时候出现一下错误 reason:  'unable  to  dequeue  a  cell  with  identifier  Cell  -  must  register ...

  5. (Problem 4)Largest palindrome product

    A palindromic number reads the same both ways. The largest palindrome made from the product of two 2 ...

  6. 【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX

    原文来自:http://blog.sciencenet.cn/blog-404069-297233.html 作复杂网络研究离不开对各种实际或模拟网络的统计.计算.绘图等工作.对于一般性的工作,我们可 ...

  7. 如何抓取Thread Dump小结(转)

    当系统性能出现问题时,需要从各个方面来查看网络环境.主机资源.查看最经变更的代码等.如果是想从代码层面解决问题,那么最有效的方法就是查看相关dump文件.如果是使用IBM JDK(我默认你是在aix环 ...

  8. php 父类子类构造函数注意事项

    网上流传的2点: PHP的构造函数继承必须满足以下条件: 当父类有构造函数的声明时,子类也必须有声明,否则会出错. 在执行父类的构造函数时,必须在子类中引用parent关键字. 第1点不需要. 第二个 ...

  9. 华为HCNA教程(笔记)

    第一章 VRP操作基础 1VRP基础 MiniUsb串口连接交换机的方法 2eNSP入门 3命令行基础(1) eNSP中路由开启后(记住port)---第三方软件连接该路由方法:telnet 127. ...

  10. Menu的自己定义实现-------保卫萝卜造塔升级塔菜单实现

    cocos2dx原生的menu排版函数实现的非常无完整,像最主要的Item的排序要想做得略微美丽一些就须要我们自己实现. 对于Menu我们能够用两种方法来实现: 1.大神级别. 继承自Control, ...