poj1905(计算几何+二分)

http://poj.org/problem?id=1905

题目:有一条金属条,长度为l,受热会膨胀变长,但两边固定,所以就变弯了。。。给出加热的度n,膨胀系数c,受热后长度为(1+n*c)*L,题目保证弯曲后可以构成圆,变长不会超过原来的一半。问金属片中间升高了多高。

思路:开始的思路就是二分,发现在二分中找不到接下来往下分的规律,看其他题解也觉得得出的一个函数是对勾函数,二分应该也是线性啊。。。之后发现由于一开始L固定的话,高度和弧的长度是正相关,所以二分枚举高度就可以了,神想法啊。。。

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

double dg,c,L,s;

void getAns(double l, double r){
	if (r - l < 0.0001){
		cout<<fixed<<setprecision(3) << l << endl;
		return ;
	}
	double mid = (l+r)/2;
	double R = (4*mid*mid + L*L )/ (8*mid);

	double _s = 2*R*asin(L/(2*R));
	if (_s < s) return getAns(mid,r);
	else getAns(l,mid);

}

int main(){
	while(cin >> L >> dg >> c && L != -1){
		s = (1+c*dg)*L;
		//smax = (1 << 31)-1;
		getAns(0, (double)L/2);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值