• <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>
            先求凸包,然后再用旋轉(zhuǎn)卡殼方法求解。
            具體做法是枚舉三角形的第一個點i,設j = i + 1,k = j + 1。然后做以下操作:
            1.計算i,j,k構(gòu)成的三角形面積a1和i,j,k + 1構(gòu)成的三角形面積a2,如果a2 < a1,則進行下一步,否則k++,重復此步。
            2.記錄此時的三角形面積b,如果b < preb(就是上一個j對應的三角形面積)j++,轉(zhuǎn)第一步,否則退出。
            可以證明這個算法的復雜度為O(n2)。具體實現(xiàn)見代碼。

            /************************************************************************* 
            Author: WHU_GCC 
            Created Time: 2007-9-12 19:48:12 
            File Name: b.cpp 
            Description:  
            ***********************************************************************
            */
             
            #include 
            <iostream> 
            using namespace std; 
            #define out(x) (cout<<#x<<": "<<x<<endl) 
            const int maxint=0x7FFFFFFF
            typedef 
            long long int64; 
            const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL; 
            template
            <class T>void show(T a, int n){for(int i=0; i<n; ++i) cout<<a[i]<<' '; cout<<endl;} 
            template
            <class T>void show(T a, int r, int l){for(int i=0; i<r; ++i)show(a[i],l);cout<<endl;} 

            const int maxn = 50010

            typedef 
            struct point_t 

                
            int x, y; 
            }


            typedef 
            struct polygon_t 

                
            int n; 
                point_t p[maxn]; 
            }


            int operator <(const point_t &a, const point_t &b) 

                
            return a.y < b.y || a.y == b.y && a.x < b.x; 
            }
             

            point_t 
            operator -(const point_t &a, const point_t &b) 

                point_t ret; 
                ret.x 
            = a.x - b.x; 
                ret.y 
            = a.y - b.y; 
                
            return ret; 
            }
             

            inline 
            int cross(const point_t &a, const point_t &b) 

                
            return a.x * b.y - a.y * b.x; 
            }
             

            int turn_left(const point_t &a, const point_t &b, const point_t &c) 

                
            return cross(b - a, c - b) > 0
            }
             

            class point_set_c 

            public
                
            void init(int _n, point_t _p[]); 
                polygon_t convex_hull(); 
            private
                
            int n; 
                point_t p[maxn]; 
            }


            void point_set_c::init(int _n, point_t _p[maxn]) 

                n 
            = _n; 
                
            for (int i = 0; i < n; i++
                    p[i] 
            = _p[i]; 
            }
             

            polygon_t point_set_c::convex_hull() 

                
            int stack[maxn]; 
                
            int top = 1
                stack[
            0= 0
                 
                sort(p, p 
            + n); 
                 
                
            for (int i = 1; i < n;) 
                

                    
            if (top == 1 || turn_left(p[stack[top - 2]], p[stack[top - 1]], p[i])) 
                        stack[top
            ++= i++
                    
            else top--
                }
             
                
            int t_top = top; 
                
            for (int i = n - 2; i >= 0;) 
                

                    
            if (top == t_top || turn_left(p[stack[top - 2]], p[stack[top - 1]], p[i])) 
                        stack[top
            ++= i--
                    
            else top--
                }
             
                 
                polygon_t ret; 
                ret.n 
            = 0
                
            for (int i = 0; i < top - 1; i++
                    ret.p[ret.n
            ++= p[stack[i]]; 
                
            return ret; 
            }
             

            point_t p[maxn]; 
            int n; 
            point_set_c ps; 
            polygon_t poly; 

            int main() 

                
            while (scanf("%d"&n), n != -1
                

                    
            for (int i = 0; i < n; i++
                        scanf(
            "%d%d"&p[i].x, &p[i].y); 
                    ps.init(n, p); 
                    poly 
            = ps.convex_hull(); 
                     
                    
            int ans = 0
                    
            for (int i = 0; i < poly.n; i++
                    

                        
            int j = i + 1, k = j + 1
                        
            if (k >= poly.n) 
                            
            break
                         
                        
            int area; 
                        
            int pre_area = -1
                        
            while (j < poly.n - 1
                        

                            area 
            = cross(poly.p[j] - poly.p[i], poly.p[k] - poly.p[i]);                 
                            
            while (k < poly.n - 1
                            

                                
            int tmp = cross(poly.p[j] - poly.p[i], poly.p[k + 1- poly.p[i]); 
                                
            if (tmp > area) 
                                

                                    k
            ++
                                    area 
            = tmp; 
                                }
             
                                
            else 
                                    
            break
                            }
             
                            
            if (area < pre_area) 
                                
            break
                            pre_area 
            = area; 
                            ans 
            >?= area; 
                            j
            ++
                            
            if (j >= k) 
                            

                                k 
            = j + 1
                                
            if (k >= poly.n) 
                                    
            break
                            }
             
                        }
             
                    }
             
                    printf(
            "%.2lf\n", ans / 2.0); 
                }
             
                
            return 0
            }
             
            posted on 2007-09-13 13:40 Felicia 閱讀(870) 評論(0)  編輯 收藏 引用 所屬分類: 計算幾何
             
            亚洲婷婷国产精品电影人久久| 天天躁日日躁狠狠久久| 亚洲国产精久久久久久久| 欧美久久精品一级c片片| 久久久久亚洲爆乳少妇无| 久久夜色精品国产噜噜亚洲a| 精品久久久中文字幕人妻| 久久久精品一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 狠狠色丁香婷婷久久综合| 久久99国产精品久久| 狠狠色丁香婷婷久久综合| 日本精品久久久久中文字幕8| 久久久高清免费视频| 999久久久免费精品国产| 久久青青草原精品国产软件| 99麻豆久久久国产精品免费| 伊人热热久久原色播放www| 人人狠狠综合久久亚洲婷婷| 久久天天躁狠狠躁夜夜网站| 午夜精品久久久久久| 国产高潮国产高潮久久久91 | 囯产精品久久久久久久久蜜桃| 国产精品久久久久jk制服| 国产成人无码精品久久久性色| 久久无码AV中文出轨人妻| 国产精品嫩草影院久久| 国产精品一久久香蕉国产线看 | 久久久久久九九99精品| 亚洲人成网站999久久久综合| 久久99精品国产麻豆婷婷| 中文字幕一区二区三区久久网站| 国产成人精品白浆久久69| 亚洲AV无码久久精品狠狠爱浪潮| 国产香蕉久久精品综合网| 亚洲欧美精品一区久久中文字幕| 99精品伊人久久久大香线蕉| 99久久国产亚洲高清观看2024| 国产日产久久高清欧美一区| 四虎国产精品免费久久5151| 国产精品久久久久AV福利动漫|