HDU 3400

果然是你存我我深深的脑海里,思路有了,调了那么久,进水了。。。

三分一边后,嵌套三分另一边。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double eps=1e-6;

struct Point{
	double x,y;
};

Point a,b,c,d;
double p,q,rr;

double how(Point dont,Point dot){
	double ans1=sqrt((dot.x-d.x)*(dot.x-d.x)+(dot.y-d.y)*(dot.y-d.y))/q	;
	double ans2=sqrt((dont.x-dot.x)*(dont.x-dot.x)+(dont.y-dot.y)*(dont.y-dot.y))/rr;
	return ans1+ans2;
}

double cal(Point dont){
	Point l,r,m,mm;
	l=c,r=d;
	while(sqrt((l.x-r.x)*(l.x-r.x)+(l.y-r.y)*(l.y-r.y))>=eps){
			m.x=(l.x+r.x)/2;
			m.y=(l.y+r.y)/2;
			mm.x=(m.x+r.x)/2;
			mm.y=(m.y+r.y)/2;
		if(how(dont,m)>how(dont,mm))
		l=m;
		else r=mm;
	}
	double lt=sqrt((dont.x-a.x)*(dont.x-a.x)+(dont.y-a.y)*(dont.y-a.y))/p;
	return how(dont,l)+lt;
}

int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
		scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
		scanf("%lf%lf%lf",&p,&q,&rr);
		Point l,r,m,mm;
		l=a; r=b;
		while(sqrt((l.x-r.x)*(l.x-r.x)+(l.y-r.y)*(l.y-r.y))>=eps){
			m.x=(l.x+r.x)/2;
			m.y=(l.y+r.y)/2;
			mm.x=(m.x+r.x)/2;
			mm.y=(m.y+r.y)/2;
			if(cal(m)>cal(mm))
			l=m;
			else r=mm;
		}
		printf("%.2lf\n",cal(l));
	}
	return 0;
}

  

时间: 2024-10-03 01:59:53

HDU 3400的相关文章

HDU 3400 Line belt 三分

笨蛋的难题(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述        笨蛋之所以称为笨蛋,是因为他有点路痴.他一旦不高兴,就必然一个人漫无目的的出去走走.今天下雨了,他又不高兴了,怎么办?那就出去走呗,这不又丢了,这次幸好记下出来时的方向,并且在一张纸上密密麻麻的记下了他拐的弯(他很聪明吧,拐的弯都是90度的弯),0代表左拐,1代表右拐,那么多0.1,他实在看不下去了,正好遇见善良加聪明的你,你能告诉他,他现在面向哪吗? 输入 多组测试数据 第一行 输入:

HDU 3400 Line belt (三分再三分)

HDU 3400 Line belt (三分再三分) ACM 题目地址: HDU 3400 Line belt 题意: 就是给你两条线段AB , CD ,一个人在AB以速度p跑,在CD上以q跑,在其他地方跑速度是r.问你从A到D最少的时间. 分析: 先三分AB上的点,再三分CD上的点即可. 证明: 设E在AB上,F在CD上. 令人在线段AB上花的时间为:f = AE / p,人走完Z和Y所花的时间为:g = EF / r + FD / q. f函数是一个单调递增的函数,而g很明显是一个先递减后递

【HDU 3400】Line belt(三分法)

题目链接 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3400 题意 有两条传送带AB和CD,移动速度分别为p,q. 除了传送带的其他区域移动速度为r,问A到D最短时间. 题目分析 在AB上找一点E,在CD上找一点F. 使得A->E->F->D时间最短. 数学思路 时间 time = |AE|/p + |EF|/r + |FD|/q. (|AE|为线段AE的长度.) 未知量有E的位置和F的位置,由于确定在AB和CD上,所以只需要两个未知量

搜索(三分):HDU 3400 Line belt

Line belt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3531    Accepted Submission(s): 1364 Problem Description In a two-dimensional plane there are two line belts, there are two segments AB

HDU 3400 Line belt (三分嵌套)

题目链接 Line belt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2862    Accepted Submission(s): 1099 Problem Description In a two-dimensional plane there are two line belts, there are two segment

三分套三分 --- HDU 3400 Line belt

Line belt Problem's Link:    Mean: 给出两条平行的线段AB, CD,然后一个人在线段AB的A点出发,走向D点,其中,人在线段AB上的速度为P, 在线段CD上的速度为Q,在其他地方的速度为R,求人从A点到D点的最短时间. analyse: 经典的三分套三分. 首先在AB线段上三分,确定一个点,然后再在CD上三分,确定第二个点,计算出answer.也就是嵌套的三分搜索. Time complexity: O(logn*logm) Source code:  // M

hdu 3400 Line belt

题意:给你两条线段AB,CD:然后给你在AB,CD上的速度P,Q,在其它部分的速度是R,然后求A到D的最短时间. 思路:用三分枚举从AB线段上离开的点,然后再用三分枚举在CD的上的点找到最优点,求距离和时间就可以. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 const double ep

hdu 2899 hdu 3400 三分/几何

hdu2899 : 水提,直接三分,其实求导后二分也可以. #include<iostream> #include<cstdio> using namespace std; double y; double inline f( long double x) { return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x; } int main() { int T;scanf("%d",&T); while

hdu 3400(三分)

题目链接:点击打开链接: 题意:本题给出两条线段,一条线段端点为a,b:另一条线段端点是c,d,在两条线段和不在线段上有不同的速度,求最短时间. 分析:本题一共有三段时间,在a-b上,在c-d上,在空白的地方.设着三段时间是x,y,z.则一旦x和y确定之后,z就能确定,因为这样在两线段上的点就确定了,z也就求出来了,如果x确定时y不确定的话,z和y有关系,所以时间是有一个极值,想到极值,就应该三分求最适合的y.而对于x来说,三分求解x的话可以搞出对应点的y的极值,也就能求出队应的y的极值.这是就