POJ1905

题目链接:http://poj.org/problem?id=1905

题目大意:

  竹竿受热会膨胀。设其原长为 L ,受热膨胀后的长度 L‘=(1+n*C)*L ,其中 n, C, L都是要输入的参数。

  原本竹竿刚好撑在两面墙中间,受热之后长度变长,于是会弯出一道弧线,求弧线最高点对于水平面的高度 h。

解题思路:

  先求出实际弧长(也就是受热膨胀后的竹竿长度),然后二分各种 h,求出 h 对应的弧长,如果弧长小于实际弧长,那么证明该 h 偏小,否则 h 偏大。具体还有几个细节请看代码。

AC代码:

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4 const double PI=acos(-1.0);
 5 int main(){
 6     double L,n,C;
 7     while(scanf("%lf%lf%lf",&L,&n,&C)==3&&(L>=0&&n>=0&&C>=0)){
 8         double nL=(1.0+n*C)*L;  //nL--实际弧长
 9         double l=0.0,r=0.5*L;
10         while(r-l>1e-8){
11             double mid=(l+r)/2;
12             double Rs=L*L/(8.0*mid)+mid/2;  //Rs--mid对应的弧的半径
13             double thata=asin(L/(2*Rs));    //弧角的一半。这里其实还有一种求法:acos((Rs-mid)/Rs),但如果用这种求法可能就WA了,想来可能是Rs这个有误差的值在此出现了2次(另一种求法之出现了1次),被卡精度了。以后做计算几何的时候要注意这个问题:在运算过程中尽量少用存在精度问题的数据!
14             double LL=Rs*2.0*thata;     //弧长公式
15             if(LL<nL)   l=mid;
16             else    r=mid;
17         }
18         printf("%.3f\n",(l+r)/2);   //这里有个巨坑!要是写"%.3lf\n"就WA,屡试不爽!无解。
19     }
20     return 0;
21 }
时间: 2024-08-09 21:56:19

POJ1905的相关文章

POJ1905 expanding rods 【水二分+谜之WA】

一道很水的题,就是不知道为什么wa,,, 其实小优那个精度控制循环控制二分的方法不算好,如果esp太小,会TLE,直接人工控制次数最好了 #include <cstdio> #include <cmath> #include <iostream> using namespace std; double getres(double r,double s,double l) { //cout<<(r-s/acos(1-l*l/(2.0*r*r)))<<

poj1905——二分法求单调函数零点解方程

poj1905——二分法求单调函数零点解方程 Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12773   Accepted: 3291 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coefficient

poj1905 Expanding Rods(二分)

题目链接:https://vjudge.net/problem/POJ-1905 题意:有一根长len的木棍,加热了n度,长度会膨胀为len*(1+n*c),c为膨胀系数.现在把这根木棍夹在两堵墙之间,木棍会向上弯曲变成弧形,求弧形中点和原木棍中点的高度差. 思路:刚开始以为是几何题,几何肯定是能做的.然后发现题解是二分,第一次二分double类的变量,学到了.设所求答案为dis,通过dis可以勾骨出半径R,然后求出弧长L,再比较L与真实弧长len.显然dis和L满足二分的单调性,那么就可以做了

【POJ1905】Expanding Rods 二分答案+推公式

题意: 给出L,n,c,通过公式可以得到L'. 然后L是弦长,L'是弧长,从圆心向该弦做垂线,若长为d,求半径-d. 题解: 二分答案. 首先弧长通过圆心角和半径是可以计算的,那么我们可以二分答案(r-d). 然后有(r-mid)^2+(L/2)^2=r*r,通过这个可以O(1)算出r. 这样就可以通过 弧长=(圆心角/360°)*2πr计算出当前弧长进行check. 因为arcsin返回值为弧度,即(180/π)度,所以最后弧长公式是2*r*asin(L/(2*r)). 代码: #includ

poj1905 Expanding Rods 二分

Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11782   Accepted: 3063 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coefficient of heat expansion. Whe

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

二分法练习1

在房神的激励下我开始预习二分法啦~ poj3273 Monthly Expense (二分,最大值最小化) 题意:将N个账款分割成M个财务期,使得每个分期账款和的最大值最小. 题解:贪心思想,二分法.上界为N天花费总和,下界为每天花费的最大值.根据mid值遍历n天花费看是否满足M各财务期条件 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int main(){ 5 int n,m,i,cnt,a[

ACM算法总结及刷题参考

参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965)    (2)贪心(poj1328,poj2109,poj2586)    (3)递归和分治法.     (4)递推.     (5)构造法.(po

POJ题目推荐(转载)

POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉.2.标记为A and B的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目.3.列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制.4.这里不少题目在BUPT ACM FTP上面都有代码,请大家合理利用资源.5.50个题目要求每个题目都要写总结,养成良好的习惯.6.这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅