• <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
            數(shù)據(jù)加載中……

            HDU 3756 Dome of Circus

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

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

            題解:
                數(shù)學(xué)推導(dǎo) + 三分

            思路:
                這是一個很有意思的題,雖然是三維的,但是可以很容易的轉(zhuǎn)化到二維去
            。來看X-Z這個平面,我們將所有的點(diǎn)進(jìn)行圓周映射,然后將所有的點(diǎn)都投影到
            X-Z平面的的第一象限去,然后問題就轉(zhuǎn)化成了在X-Z平面上找到一條斜率為負(fù)
            的直線L,L和X正方向、Z正方向圍成的三角形包含所有點(diǎn),如果假設(shè)L和X軸的
            交點(diǎn)為R,和Z軸焦點(diǎn)為H,要求pi*H*R^2的值最小。
                然后我們來看看H和R之間有什么千絲萬縷的關(guān)系。首先L這條線必定和某一
            個給定的點(diǎn)擦邊,也就是經(jīng)過那個點(diǎn),我們假設(shè)它經(jīng)過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)這個函數(shù)的導(dǎo)數(shù):
            V'(K) = - pi * (aK^2 + 2bK) * (aK - b)^2 / K^2
            影響這個導(dǎo)數(shù)的正負(fù)性的唯一條件是 -(aK^2 + 2bK)
            當(dāng)-2b/a < K < 0時(shí)V'(K)大于零,也就是V的值是隨著K遞增的。
            當(dāng)K < -2b/a時(shí)V'(K)小于零,也就是V的值是隨著K遞減的。
            于是可以得出一個結(jié)論,當(dāng)K = -2b/a 時(shí)V取得最小值。
            于是我們知道了V的單峰性,然后就可以通過枚舉半徑R,因?yàn)镽對于V具有單谷
            性,所以枚舉R的時(shí)候可以采用三分。每次通過三分R找到最小的H,這個過程可
            以通過枚舉每個點(diǎn),找到最大的極角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 英雄哪里出來 閱讀(1231) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)學(xué)

            国产毛片欧美毛片久久久| 国产精品久久久久久久久| 污污内射久久一区二区欧美日韩| 久久久久国产精品三级网| 久久天天躁夜夜躁狠狠躁2022| 97精品久久天干天天天按摩| 精品久久久久久国产免费了| 久久精品国产久精国产果冻传媒| 97久久超碰成人精品网站| 亚洲va久久久久| 国内精品久久久久久久coent| 久久夜色精品国产www| 国产精品99久久免费观看| 无码8090精品久久一区| 久久久91精品国产一区二区三区| 伊人久久大香线蕉AV一区二区| 久久精品中文騷妇女内射| 亚洲精品国产第一综合99久久| 996久久国产精品线观看| 99久久国产宗和精品1上映| 国产精品免费看久久久香蕉| 久久精品国产亚洲AV无码偷窥| 欧美伊人久久大香线蕉综合 | 色综合久久精品中文字幕首页 | 成人妇女免费播放久久久| 亚洲精品第一综合99久久| 久久久久综合中文字幕| 久久亚洲高清观看| 久久―日本道色综合久久| 久久国产精品无码一区二区三区| 久久精品视频一| 亚洲七七久久精品中文国产| 精品国产乱码久久久久久浪潮 | 久久91精品国产91久久麻豆| 99久久中文字幕| 国产综合久久久久久鬼色| 九九精品99久久久香蕉| 久久棈精品久久久久久噜噜| 精品乱码久久久久久久| 99久久99这里只有免费的精品| 国产精品久久久久久久久鸭 |