• hdu 2289 要二分的杯子


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2289

    大意是 一个Cup,圆台形,给你它的顶部圆的半径,底部圆的半径,杯子的高度,和此时里面装的水的体积,求水的高度。

    这道题好在能够锻炼算法思维,或者说形成算法思维。

    这是一道二分逼近求值的应用

    题目已经给定杯子的高度是0~100,故在这个范围内进行二分,但走了涉及到还有小数的问题,故可以取一个精度较高的误差值

    来作为二分的条件,二分一次,以这个值作为水的高度求出水的体积与实际值比较一次,当误差不大于误差值时,便取为高。

    另圆台体积公式:设上底的半径为r ,下底的半径为R ,高为h则V= (1/3)*pi*h*(R^2 + Rr +r^2) pi为圆周率

     1 #include <stdio.h>
     2 #include <math.h>
     3 double PI=acos(-1.0); //圆周率
     4 double haha = 0.000000001;//取误差值
     5 
     6 double yj(double r,double R,double h,double H)
     7 {
     8     double u = h/H*(R-r) + r; //求出水面圆的半径
     9     return PI/3*(r*r+r*u+u*u)*h;//返回水圆台的体积
    10 }
    11 
    12 double ls(double r,double R,double H,double v)
    13 {
    14     double left,right,temp,mid;
    15     left = 0,right = 100;
    16     while ((right-left)>haha)//二分条件变成了与误差值相比较
    17     {
    18         mid = (left+right)/2;
    19         temp= yj(r,R,mid,H);
    20         if (fabs(temp-v)<=haha)
    21             return mid;
    22         else if(temp<v)
    23             left=mid+haha;
    24         else
    25             right = mid-haha;
    26     }
    27     return (right+left)/2;
    28 }
    29 
    30 int main()
    31 {
    32     int t;
    33     double r,R,H,v;
    34     while (~scanf("%d",&t)){
    35     while (t--)
    36     {
    37         scanf("%lf%lf%lf%lf",&r,&R,&H,&v);
    38         printf("%.6lf
    ",ls(r,R,H,v));
    39     }
    40     }
    41     return 0;
    42 }
  • 相关阅读:
    android连接wifi模块
    idea 控制台乱码debug
    线程控制
    jvm 垃圾回收
    java 单例模式
    http报头
    java 构造函数 , 参数传递 , lamda表达式
    mysql 杂识
    spring mvc 配置 拦截器不起作用
    spring mvc 每次请求后是否自动销毁线程
  • 原文地址:https://www.cnblogs.com/JJCHEHEDA/p/4662547.html
Copyright © 2020-2023  润新知