随笔 - 68  文章 - 57  trackbacks - 0
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(8)

随笔分类(74)

随笔档案(68)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  题目不难,就是给定一个w * h的纸,中间切一刀,切出来的两个矩形,从一个中剪下一个圆做圆柱的底,然后让另一个弯起来套住底,做柱面,最后求能形成的最大体积。
  练习的时候做了一下,总是WA。后来仔细想了一想,发现要讨论几种情况。首先要确保圆的直径要不大于w,之后因为弯曲矩形可以有两种方式,要分别讨论。一种是高为w,这样只需底面直径越大越好。一种是高不定,这时候需要列一个方程,求出极值点。可以证明极值就是极大值。但是要注意的是底面圆直径是有范围的,要注意极值点是否落在范围内。如果不在,由于极值点左侧单调递增,那么取直径为w就是这种情况的最优解。
  这种题目比赛的时候很容易出错,需要静下心来仔细想好才行,这方面能力以后还要多多锻炼。
题目代码:
#include <iostream>
#include 
<cmath>
using namespace std;
const double pi = acos(-1.0), eps = 1e-6;

int main()
{
    
double w, h, s, d;

    
while (scanf("%lf %lf"&w, &h) == 2)
    {
        
if (fabs(w) < eps && fabs(h) < eps)
            
break;
        
if (h < w)
            swap(w, h);
        d 
= h / (pi + 1);
        d 
= min(d, w);
        s 
= pi * d * d * 0.25 * w;
        d 
= 2.0 * h / 3.0;
        
if (pi * d <= w)
        {
            d 
= min(d, w);
            s 
= max(s, pi * h * h * h / 27.0);
        }
        s 
= max(s, w * w * (pi * h - w) / (4 * pi * pi));
        printf(
"%.3lf\n", s);
    }

    
return 0;
}
posted on 2009-05-25 16:10 sdfond 阅读(295) 评论(0)  编辑 收藏 引用 所属分类: Algorithm - Computational Geometry

只有注册用户登录后才能发表评论。
相关文章:
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理