欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通(1246:膨胀的木棍)

发布时间:2025/3/17 编程问答 23 豆豆
生活随笔 收集整理的这篇文章主要介绍了 信息学奥赛一本通(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:膨胀的木棍)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。