這是個幾何題目,圖示如下:
?????????2210image.jpg
???????????????????????????????????????????????? ??? (?????? W????? ?)
題目中已知X,Y,C(兩線交點距地面的高度)求街道的寬度(w)。根據幾何原理求得方程:1/c=1/sqrt((x*x-w*w)+1/sqrt((y*y-w*w))。這是個不能反解出w的隱方程(我試了很久,都沒做出),所以要計算w的值就不能那么簡單,所以我們就很快就想到“牛頓迭代法”,但這個方程的結構比較復雜(關鍵是我對牛頓迭代法不是很了解,呵呵),所以我選用了“二分迭代逼近求值”(我的一位學姐告訴我的,當時她這道題也沒做,我告訴她這個公式,怎么樣具體編程時,告訴我的,由二分搜索引出)。然后我根據她告訴我的思想做了一個,代碼如下:

/*
??Name:?二分逼近求解
??Copyright:
??Author:?LonelyTree

??Date:?15-08-08?11:03
??Description:?對方程w的二分逼近求解:1/c=1/?1/sqrt((x*x-mid*mid))+1/sqrt((y*y-mid*mid))
*/


#include
< stdio.h >
#include
< math.h >

#define ?EPS?0.000001
int ?main( void )
{
????
double ?x,y,c;
????
double ?high,low,mid;
????
while (scanf( " %lf?%lf?%lf " , & x, & y, & c) == 3 )
????
{

????????high
= x > y ? y:x;
????????low
= 0.0 ;
????????
while (high >= low)
????????
{
???????????mid
= (high + low) / 2 ;
???????????
if ( 1 / c - 1 / sqrt((x * x - mid * mid)) - 1 / sqrt((y * y - mid * mid)) <= EPS)
???????????
{
????????????????printf(
" %.3lf\n " ,mid);
????????????????
break ;
???????????}

???????????
else ? if ( 1 / c - 1 / sqrt((x * x - mid * mid)) - 1 / sqrt((y * y - mid * mid)) > EPS)
???????????
{
????????????????low
= mid;
???????????}

???????????
else
???????????
{
???????????????high
= mid;
???????????}


????????}

????????

????}

????
return ? 0 ;
}










呵呵,大家看看這段代碼有什么問題。我當時做出了對提供的4組數據進行了測試,OK通過,然后高高興興去sumbit了,令我大吃一驚是個TLE,哇,心一下就陰了,話了很長時間做了個TLE的。然后回過頭來仔細檢查了一下,經幾番思考,對代碼進行如下處理,代碼如下:

/*
??Name:?二分逼近求解
??Copyright:
??Author:?LonelyTree

??Date:?15-08-08?11:03
??Description:?對方程w的二分逼近求解:1/c=1/?1/sqrt((x*x-mid*mid))+1/sqrt((y*y-mid*mid))
*/


#include
< stdio.h >
#include
< math.h >

#define ?EPS?0.000001
int ?main( void )
{
????
double ?x,y,c;
????
double ?high,low,mid;
????
while (scanf( " %lf?%lf?%lf " , & x, & y, & c) == 3 )
????
{

????????high
= x > y ? y:x;
????????low
= 0.0 ;
????????
while (high - low > EPS)
????????
{
???????????mid
= (high + low) / 2 ;
???????????
if ( 1 / c > ( 1 / sqrt((x * x - mid * mid)) + 1 / sqrt((y * y - mid * mid))))
???????????
{
????????????????low
= mid;
???????????}

???????????
else
???????????
{
????????????????high
= mid;
???????????}


????????}

????????printf(
" %.3lf\n " ,mid);

????}

????
return ? 0 ;
}










然后又測了數據,sample過了,然后小心的去sumbit,這次對了,Accpected了哈!呵呵,現在請大家思考一下這兩種代碼的區別,為什么前一種是TLE的而后一種是AC的(問題就在while的條件)……