zoj 3203 Light Bulb

一开始我都不知道怎么求,后来有人给我讲了一遍,我才有了大概的思路,但是后来求出的数字总是不对,我对照别人的答案才发现我没有理解三分查找的思想。


哎 ,总结的说 :这个题是水题,但是我花去的大量的时间。实在是可惜啊。



解题思路 :首先就是要推倒思路,思路有两种

我设投射在墙上的影子长度为x

投射在地上的影子为y

第一种是推导出 用墙上的x表示出y的数值,最后直接求出y的最大值和最小值就可以了。

第二种是推导出 用地上的y表示出x的数值,最后直接求出x的最大值和最小值就可以了。


这两种方法推倒都非常简单,初中数学就够用,不过我好想推到了好几遍,发现总是结果不对,后来才发现,推倒正确了,只是我三分查找写错了。


以后还是认真学习算法吧。。。。。。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define	EPS		1e-9
double H,h,D;

inline double Calc(double x){
	return (h-x)*D/(H-x)+x;
}

void Sovel(){
	double Left,Right,Mid,MidMid;
	Left = 0;
	Right = h;
	while(Left + EPS < Right){
		Mid = (Left+Right)/2;
		MidMid = (Mid+Right)/2;
		if(Calc(Mid) >= Calc(MidMid)) Right = MidMid;
		else Left = Mid;
//		printf("Left = %lf\n",Left);
//		printf("Right = %lf\n",Right);
	}
	printf("%0.03lf\n",Calc(Left));
}
int main( void ){
	int num;
	scanf("%d",&num);
	while(num--){
		scanf("%lf%lf%lf",&H,&h,&D);
		Sovel();			
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值