XMU 1125 越野車大賽 【三分】

1125: 越野車大賽

Time Limit: 500 MS  Memory Limit: 64 MB  Special Judge
Submit: 8  Solved: 4
[Submit][Status][Web Board]

Description

  TheBeet正在參加一場越野車大賽。比賽的場地如右圖:
  共分三塊,每一塊地面的長寬均爲N與M,但地表情況不同,越野車在這段路面上的最高速度也不同。
  藍色線表示TheBeet可能的行車路線。
  比賽的要求是要求選手從比賽的場地左上角駕車至右下角。TheBeet想知道如果他在所有路段都以最快速度行駛(不考慮加速階段),最快能在多少時間內完成比賽。

Input

  輸入數據的第一行爲兩個正整數N M(N<=3000,M<=1000),表示一塊路面的長和寬。
  第二行爲三個正整數S1,S2,S3(0<S1,S2,S3<=100),從上至下依次表示各個路面上越野車的最高速度。

Output

  輸出一個實數表示TheBeet最快能在多少時間內完成比賽。請輸出一個儘可能精確的數字,控制誤差在±0.000001的內。

Sample Input

30 10
2 5 3

Sample Output

13.7427361525

HINT

  如果你的輸出和結果的相差在0.000001之內,則認爲是正確答案。

Source

[Submit][Status][Web Board]


題目鏈接:

  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1125

題目大意:

  比賽地分三塊,每一塊地面的長寬均爲N與M,在1 2 3號地上的速度爲S1,S2,S3。

  問從左上角到右下角的最小耗時。

題目思路:

  【三分】

  假設第一段到i,第二段到j,則t=sqrt(1.0*sqr(i)+sqr(m))/s1+sqrt(1.0*sqr(j-i)+sqr(m))/s2+sqrt(sqr(n-j)+sqr(m))/s3

  易知t爲i,j的函數,且單調。所以兩層三分答案。

  設區間l,r,取三等分點x1,x2的函數值f1,f2比較,若f1優則r=x2,否則l=x1

  直到區間間隔小於EPS停止。

  此時即爲答案。



/****************************************************
	
	Author : Coolxxx
	Copyright 2017 by Coolxxx. All rights reserved.
	BLOG : http://blog.csdn.net/u010568270
	
****************************************************/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
const double EPS=1e-8;
const int J=10000;
const int MOD=100000007;
const int MAX=0x7f7f7f7f;
const double PI=3.14159265358979323;
const int N=1004;
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans;
double s1,s2,s3;
inline double cal(double i,double j)
{
	return sqrt(1.0*sqr(i)+sqr(m))/s1+sqrt(1.0*sqr(j-i)+sqr(m))/s2+sqrt(sqr(n-j)+sqr(m))/s3;
}
int main()
{
	#ifndef ONLINE_JUDGE
//	freopen("1.txt","r",stdin);
//	freopen("2.txt","w",stdout);
	#endif
	int i,j,k,l;
	int x,y,z;
//	for(scanf("%d",&cass);cass;cass--)
//	for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
//	while(~scanf("%s",s))
	while(~scanf("%d",&n))
	{
		scanf("%d",&m);
		scanf("%lf%lf%lf",&s1,&s2,&s3);
		double xl,xr,yl,yr,x1,x2,y1,y2,f1,f2;
		anss=1e20;
		xl=0;xr=n;
		while(xr-xl>EPS)
		{
			x1=(xl+xl+xr)/3.0;
			x2=(xl+xr+xr)/3.0;
			yl=x1;
			yr=n;
			while(yr-yl>EPS)
			{
				y1=(yl+yl+yr)/3.0;
				y2=(yl+yr+yr)/3.0;
				f1=cal(x1,y1);
				f2=cal(x1,y2);
				if(f1<f2)
					yr=y2;
				else yl=y1;
			}
			anss=f1;
			
			yl=x2;
			yr=n;
			while(yr-yl>EPS)
			{
				y1=(yl+yl+yr)/3.0;
				y2=(yl+yr+yr)/3.0;
				f1=cal(x2,y1);
				f2=cal(x2,y2);
				if(f1<f2)
					yr=y2;
				else yl=y1;
			}
			f1=anss;
			if(f1<f2)
				xr=x2;
			else xl=x1;
		}
		printf("%.10lf\n",anss);
	}
	return 0;
}
/*
//

//
*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章