【FOJ】Problem 1083 Expanding Rods

Problem 1083 Expanding Rods.

题意

我不会我看题解做的我好卑微

  • coefficient - 系数
    chord - 弦
    displayed - 置换
  • 原长度L,加热n度膨胀后新长度L’=(1+n*C)*L,C是热膨胀系数,膨胀后是圆弧,计算弓高。
    L’ 上限为1.5L
  • 输入多行:L,n,C
  • 输出弓高,保留三位小数

思路

  • s = 2ar = 2r*asin(L/(2r))
    r2 = (r-d)2 + L2/4
    化简得 r = d/2 + L2/(8d)
    d,r未知
  • 二分法列举d,弦固定弓高越高弧越长,即d越大s越大
    把d带入求r,计算s,将s与L’=(1+n*c)*L比较,当s大时d取左区间,否则右区间
  • d最小为0(没有膨胀的时候),当 r = L/2 时d最大(膨胀到半圆的时候)为L/2
    此时的L’ = πr = π/2*L > 1.5L,题意L’不会比1.5L大,所以这里d=L/2一定比题意最大的d大,可以用来做d的上限。
  • 输出保留三位小数,把right - left < 0.00001作结束条件

笔记

  • 1e-5,e前后都要有数字,后必须是整数
  • 弧长=角度×半径
  • 比较条件模棱两可的浮点计算,请不要吝啬你的>=和<=,AC和WA仅一步之遥啊哭
    不想说了具体见代码

代码

#include<cstdio>
#include<math.h>
const double esp=1e-5;

int main(){
	double L, n, C, r, d, s;
	double left, right;
	while(scanf("%lf%lf%lf",&L,&n,&C)!=EOF){
		if(L<0 && n<0 && C<0)
			break;
		left = 0.0;
		right = 0.5*L;
		s = (1+n*C)*L;
		while(right-left>esp){
			d = (left+right)/2;
			r = d/2 + L*L/8/d;
			if(s<2*r*asin(L/(2*r)))	//注意这里是WA的,换成<=以后可以AC
				right = d;
			else
				left = d;
			/*
			if(s>2*r*asin(L/(2*r)))	//这里也可以AC,你自己品一下
				left = d;
			else
				right = d;
			*/
		}
		printf("%.3f\n", d);
	}
	return 0;
}
发布了28 篇原创文章 · 获赞 0 · 访问量 326

猜你喜欢

转载自blog.csdn.net/qq_44531167/article/details/105166526