信息学奥赛一本通(1246:膨胀的木棍)
生活随笔
收集整理的这篇文章主要介绍了
信息学奥赛一本通(1246:膨胀的木棍)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
1246:膨胀的木棍
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3335 通过数: 1105
【题目描述】
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L’=(1+n*C)*L,其中C是热膨胀系数。
当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。
你的任务是计算木棍中心的偏移距离。
【输入】
三个非负实数:木棍初始长度(单位:毫米),温度变化(单位:度),以及材料的热膨胀系数。
保证木棍不会膨胀到超过原始长度的1.5倍。
【输出】
木棍中心的偏移距离(单位:毫米),保留到小数点后第三位。
【输入样例】
1000 100 0.0001【输出样例】
61.329【分析】
圆弧长度公式:,L——弧长,n0 —— 角度,R —— 半径,θ —— 弧度
即,p=x*r
由于,,故,
由于,,故,
带入 r 得,
利用二分法找到最合适的圆心角x,求木棍中心的偏移距离。
【参考代码】
#include <stdio.h> #include <math.h> #define PI acos(-1) int main() {double l1,n,c; //木棍初始长度,温度,膨胀系数double left=0,right=PI,mid; //二分法的左值、右值、中间值 double l2;scanf("%lf%lf%lf",&l1,&n,&c); l2=(1+n*c)*l1;while(right-left> 1e-12){mid=(left+right)/2.0;if(2*l2/l1 > mid/sin(mid/2.0))left=mid;elseright = mid;}printf("%.3lf\n",l2/mid*(1-cos(mid/2)));return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1246
总结
以上是生活随笔为你收集整理的信息学奥赛一本通(1246:膨胀的木棍)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 信息学奥赛一本通(1125:矩阵乘法)
- 下一篇: 信息学奥赛一本通(1133:输出亲朋字符