• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
            數據加載中……

            HDU 3756 Dome of Circus

            題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3756

            /*
            題意:
                在一個三維空間中,給定一些點,這些點的z坐標都是大于0的。要求求
            出一個圓錐(底面是圓形),使得這個圓錐的底面在z = 0的平面上,它能夠
            包含所有給定的點并且圓錐的體積要求最小。

            題解:
                數學推導 + 三分

            思路:
                這是一個很有意思的題,雖然是三維的,但是可以很容易的轉化到二維去
            。來看X-Z這個平面,我們將所有的點進行圓周映射,然后將所有的點都投影到
            X-Z平面的的第一象限去,然后問題就轉化成了在X-Z平面上找到一條斜率為負
            的直線L,L和X正方向、Z正方向圍成的三角形包含所有點,如果假設L和X軸的
            交點為R,和Z軸焦點為H,要求pi*H*R^2的值最小。
                然后我們來看看H和R之間有什么千絲萬縷的關系。首先L這條線必定和某一
            個給定的點擦邊,也就是經過那個點,我們假設它經過P(a, b), 并且L的斜率
            為K(K < 0),那么L的方程就可以表示為 L:  y = K * (x - a) + b,則H和R就
            可以利用這個方程表示出來:
            H = -a * K + b;
            R = -b / K + a;
            那么所求的圓錐的體積就是:
            V = pi*H*R^2 = pi * (-a * K + b) * (-b / K + a) ^ 2
            容易得到V(K)這個函數的導數:
            V'(K) = - pi * (aK^2 + 2bK) * (aK - b)^2 / K^2
            影響這個導數的正負性的唯一條件是 -(aK^2 + 2bK)
            當-2b/a < K < 0時V'(K)大于零,也就是V的值是隨著K遞增的。
            當K < -2b/a時V'(K)小于零,也就是V的值是隨著K遞減的。
            于是可以得出一個結論,當K = -2b/a 時V取得最小值。
            于是我們知道了V的單峰性,然后就可以通過枚舉半徑R,因為R對于V具有單谷
            性,所以枚舉R的時候可以采用三分。每次通過三分R找到最小的H,這個過程可
            以通過枚舉每個點,找到最大的極角alpha,R*tan(alpha)就是H了。
                這里需要注意的就是精度問題了。
            */


            #include 
            <iostream>
            #include 
            <cmath>
            #include 
            <algorithm>
            using namespace std;

            #define eps 1e-6
            const double pi = acos(-1.0);

            struct Point {
                
            double x, y, z;
                
            double v, h;

                
            void SCANF() {
                    scanf(
            "%lf %lf %lf"&x, &y, &z);
                    v 
            = z;
                    h 
            = sqrt(x*+ y*y);
                }

            }
            pt[ 10001 ];

            int n;
            double MaxH, MaxV;

            double Calc(double R) {
                
            int i;
                
            double Max = 0;
                
            int idx = 0;
                
            for(i = 0; i < n; i++{
                    
            double nv = pt[i].v / (R - pt[i].h);
                    
            if(nv > Max) {
                        Max 
            = nv;
                        idx 
            = i;
                    }

                }

                
            return Max * R;
            }


            int main() {
                
            int t;
                
            int i;

                scanf(
            "%d"&t);
                
            while(t--{
                    scanf(
            "%d"&n);
                    MaxH 
            = MaxV = 0;
                    
            for(i = 0; i < n; i++{
                        pt[i].SCANF();
                        
            if(pt[i].h > MaxH)
                            MaxH 
            = pt[i].h;
                        
            if(pt[i].v > MaxV)
                            MaxV 
            = pt[i].v;
                    }


                    
            double l = MaxH + eps, r = 1e6;
                    
            double ml, mr;

                    
            while(l + 1e-6 < r) {
                        ml 
            = (2 * l + r) / 3;
                        mr 
            = (l + 2 * r) / 3;

                        
            double lans = Calc(ml) * ml * ml;
                        
            double rans = Calc(mr) * mr * mr;

                        
            if( lans > rans ) {
                            l 
            = ml + 1e-5;
                        }
            else
                            r 
            = mr - 1e-5;
                    }

                    
            double ans = (l + r) / 2;
                    printf(
            "%.3lf %.3lf\n", Calc(ans), ans);
                }

                
            return 0;
            }

            posted on 2011-04-12 22:58 英雄哪里出來 閱讀(1217) 評論(0)  編輯 收藏 引用 所屬分類: 數學

            国产AⅤ精品一区二区三区久久| 色天使久久综合网天天| 人妻丰满AV无码久久不卡 | 高清免费久久午夜精品| 久久99国产精品一区二区| 久久黄视频| 久久精品亚洲精品国产色婷| 久久er国产精品免费观看8| 久久久亚洲欧洲日产国码是AV| 99久久免费国产精品热| 老司机午夜网站国内精品久久久久久久久 | 久久www免费人成精品香蕉| 亚洲伊人久久成综合人影院 | 国内精品久久久久久久涩爱| 久久乐国产综合亚洲精品| 97久久超碰国产精品旧版| 亚洲国产精品狼友中文久久久 | 中文精品久久久久国产网址| 一本大道久久香蕉成人网| 久久综合狠狠综合久久激情 | 欧美久久综合九色综合| 国内精品久久久久久野外| 亚洲日韩中文无码久久| 欧美性大战久久久久久| 久久精品成人免费看| 久久精品中文字幕无码绿巨人 | 99久久国产主播综合精品| 7777精品久久久大香线蕉| 久久综合色老色| 久久国内免费视频| 欧美精品福利视频一区二区三区久久久精品| 久久免费的精品国产V∧| 亚洲AV无码1区2区久久 | 久久久久久久精品成人热色戒| 成人精品一区二区久久| 热久久这里只有精品| 国产精品99久久精品| 久久亚洲欧美日本精品| 久久黄视频| 久久精品成人欧美大片| 久久综合日本熟妇|