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

题目链接:点击打开链接

题意:点击打开链接

三分house到shop的距离,二分这条斜边到cinema的距离

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll int
#define N 90
#define Pi 3.1415926535898
#define eps 1e-10
double t1, t2;
struct node{
	double x,y;
}c,h,s;
double dist(double x1,double y1,double x2,double y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double dist(node a,node b){
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double work(double du){
	node x = {s.x*(1-du) + h.x*du, s.y*(1-du)+h.y*du};
	double ac = dist(x,c), as = dist(x,s), ah = dist(x,h);
	if(ac+ah<=t2&&ac+as<=t1)return min(t2-ah,t1-as);
	double l = 0, r = 1.0;
	for(int i = 1; i <= 300 ; i++){
		double mid = (l+r)/2;
		node b = {c.x*(1-mid)+x.x*mid,c.y*(1-mid)+x.y*mid};
		double bc = dist(b,c), bs = dist(b, s), bh = dist(b, h);
		if(bc+bh<=t2 && bc+bs<=t1) l = mid;
		else r = mid;
	}
	node b = {c.x*(1-l)+x.x*l, c.y*(1-l)+x.y*l};
	return dist(b,c);
}
int main(){
	ll i, j, u, v;
	while(cin>>t1>>t2){
		cin>>c.x>>c.y;
		cin>>h.x>>h.y;
		cin>>s.x>>s.y;
		double a = dist(c,s), b = dist(c,h), c = dist(h,s);

		if(b+t2>=a+c){printf("%.8lf\n",min(a+t1+c,b+t2));continue;}
		t1+=a+eps; t2+=b+eps;
		double l = 0, r = 1.0, ans = 0;
		for(i = 1; i <= 300; i++){
			double mid1 = (l+r)/2.0, mid2 = (mid1+r)/2.0;
			double ans1 = work(mid1), ans2 = work(mid2);
			if(ans1<ans2) l = mid1;
			else r = mid2;
			ans = max(ans, max(ans1,ans2));
		}
		printf("%.8lf\n",ans);
	}
	return 0;
}

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

时间: 2024-10-07 06:30:21

Codeforces 8D Two Friends 三分+二分+计算几何的相关文章

Codeforces 374D Inna and Sequence 二分+树状数组

题目链接:点击打开链接 给定n个操作,m长的序列a 下面n个数 if(co>=0)则向字符串添加一个co (开始是空字符串) else 删除字符串中有a的下标的字符 直接在序列上搞,简单模拟 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h&

【二分+计算几何】hdu 4033 Regular Polygon

[二分+计算几何]hdu 4033 Regular Polygon 题目链接:hdu 4033 Regular Polygon 题目大意 已知正多边形中的一个内点到所有顶点的距离,求多边形的边长. 二分问题一般都存在含有一个未知量的方程(等式关系),通过二分未知量的范围实现查找,这道题目的几何关系就是:知道一边,内角和(围着内点)等于360度.根据三角不等式确定边的二分范围,二分查找边使得内角之和为2π即可. 说一下思路 笔者根据第一条边和最后一条边确定二分边的范围,边确定由余弦定理能确定所有内

codeforces #8D Two Friends 二分答案+计算几何

题目大意:给定平面上的三个点A,B,C,Alan需要从A走到C再走到B,Bob需要从A直接走到B,要求Alan走过的长度不能超过最短路长度+t1,Bob走过的长度不能超过最短路长度+t2,求两人在一起最多走多久(分开后再汇合不算一起走) 设Alan最多走L1,Bob最多走L2 首先如果Bob能陪伴Alan全程(即L2≥Distance(A,C)+Distance(C,B)),那么答案显然为min(L1,L2) 否则两人分离时Bob一定还没有经过C点 容易发现答案是单调的,我们不妨二分答案 不妨设

bzoj1568: [JSOI2008]Blue Mary开公司 三分+二分+线段树

答案序列一定是个下凸壳,因此添加的等差数列与其之差是个单峰函数,可以先三分求出最值,再二分求出零点,然后用线段树,将得到的区间修改为一个等差数列. 这个做法应该比较好想吧,虽然比较慢…… #include<cstdio> #define Z int l=1,int r=N,int k=1 #define N 50000 #define M (l+r>>1) #define P (k<<1) #define S (k<<1|1) #define K l,r,k

Codeforces 479D Long Jumps(贪心+二分)

题目链接:Codeforces 479D Long Jumps 题目大意:valery是个体育老师,现在他要为学生考跳远,女生标准为x,男生为y,现在一个长为L的刻度尺,有N个刻 度,给定N个刻度,现在为说还需要加几个刻度才能测量x,y这两个长度. 解题思路:因为总共就x,y两个长度,所以最多加两个刻度.所以只要判断不加和加一个的情况即可. 先枚举每个刻度a[i],然后用二分查找一下a[i]+x或者a[i]-x刻度存不存在,同理y.如果x和y都通过判断,那么就是不需 要加刻度. 如果只通过x或只

Codeforces 484B Maximum Value(高效+二分)

题目链接:Codeforces 484B Maximum Value 题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,并且ai≥aj 解题思路:类似于素数筛选法的方式,每次枚举aj,然后枚举k,每次用二分找到小于k?aj并且最大的ai,维护答案,过程中加了一些剪枝. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn =

HDU 4335 Party All the Time(三分|二分)

 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string>

Codeforces 825D Suitable Replacement - 贪心 - 二分答案

You are given two strings s and t consisting of small Latin letters, string s can also contain '?' characters. Suitability of string s is calculated by following metric: Any two letters can be swapped positions, these operations can be performed arbi

Codeforces 483B Friends and Presents(二分+数论)

题目链接:Codeforces 483B Friends and Presents 题目大意:要将1~v直间的数分配到两个集合中,第一个集合需要cnt1个数,第二个需要cnt2个数,第一个集合中的数 不能是x的倍数,同理第二个集合不能是y的倍数,两集合元素不能相同,问说v最小可以为多少. 解题思路:这题比第三题要难,想了有一会.二分答案,v,然后判断. 判断的时候只要分别判断集合一,二个数是否满足,但是因为有些数可以被分到两个集合,所以要判断总的可分配个数 是否满足大于cnt1+cnt2,计算总