[POJ] 1905 — Expanding Rods 二分
原题链接:https://vjudge.net/problem/17093/origin
题目大意:
两端固定的杆被加热变形成一段圆弧,求出杆的中点相比原来的偏移距离。
题目分析:
刚开始我看完题是丈二和尚摸不着头脑,无从下手。后面想到它的圆心角应该不会超过pi(圆周率),着手尝试发现很复杂还错了,所以换了一个思路,就是所求的偏移距离不会超过杆的原长,所以我以区间(0,杆的原长)进行而二分,在运用一些数学公式,最后AC。
代码实现:
#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstdio>
#include <cstdlib>
using namespace std;
double x, y, n, c;
//判断是求大了还是求小了
bool judge(double h)
{
//根据偏移距离求出半径,数学知识
double r = (h / 2) + (x * x) / (8 * h);
//求出杆变形后的长度
double y1 = 2 * r * asin(x / (2 * r));
//与正确的杆变形长度比较
if(y1 > y) return true;
else return false;
}
int main()
{
double l, r, mid;
while(true)
{
cin >> x >> n >> c;
if(x < 0 || n < 0 || c < 0) break;
if(x == 0 || n == 0 || c == 0) printf("%.3f\n",0.0);
else{ //二分
y = (1 + n * c) * x;
l = 0; r = x;
while(r - l > 1e-6)
{
mid = (l + r) / 2;
if(judge(mid)) r = mid;
else l = mid;
}
printf("%.3f\n",r);
}
}
return 0;
}
最后,希望路过的dl们能给予改进的建议!