• <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>

            學習心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據(jù)結果的正負來判斷給的點集的時針方向?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫的這個get_fail() 好像并是真正的get_fail,也是說fail指向的串并不是當前結點的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄]
            • 這個是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評論內容較長,點擊標題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發(fā)在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

            代碼比較長,寫蹉了……

            #include <iostream>
            #include 
            <algorithm>
            #include 
            <math.h>
            #include 
            <string.h>
            #define eps 1e-7

            using namespace std;

            struct point{double x, y, angle, dis;};

            int sig(double a)
            {
            return (a > eps) - (a < -eps);}

            double dist(point a, point b)
            {
            return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}

            double cross(point a,point b,point c)
            {
            return (a.x - c.x)*(b.y - c.y) - (a.y - c.y)*(b.x - c.x);}

            double mul(point a, point b)
            {
            return a.x*b.x + a.y*b.y;}

            double mod(point a)
            {
            return a.x*a.x + a.y*a.y;}

            double jiajiao(point a, point b)
            {
                
            if(!sig(mul(a,b)-(mod(a)*mod(b)))) return 0;
                
            return acos(mul(a,b)/sqrt(mod(a)*mod(b)));
            }

            bool cmp(point a, point b)
            {
                
            return !sig(a.angle-b.angle) && sig(a.dis-b.dis)<0 || sig(a.angle-b.angle)<0;
            }

            point m0[
            1001], m1[1001], h0[1001], h1[1001], ray, base;
            int len0, len1, id0[1001], id1[1001];
            //m1 m2 原始點集  h1 h2凸包 ray基準向量 base基準點 
            //len[0]是 h[0]的長度 
            int n;

            void read()
            {
                
            for(int i = 0; i < n; i ++)
                    scanf(
            "%lf %lf"&m0[i].x, &m0[i].y);
                
            for(int i = 0; i < n; i ++)
                    scanf(
            "%lf %lf"&m1[i].x, &m1[i].y);
            }

            void tubao0()
            {
                point a 
            = m0[0];
                
            int j = 0, i;
                
            for(i = 1; i < n; i ++)
                
            if(m0[i].y==a.y&&m0[i].x<a.x || m0[i].y<a.y)
                {
                    j 
            = i;
                    a 
            = m0[i];
                }
                swap(m0[
            0] , m0[j]);    
                m0[
            0].angle = 0;
                
            for(i = 1; i < n; i ++)
                {
                    m0[i].angle 
            = atan2(m0[i].y - m0[0].y, m0[i].x - m0[0].x);
                    m0[i].dis 
            = dist(m0[0], m0[i]);
                }
                sort(m0 
            + 1, m0 + n, cmp);
                
            int top = 0;
                id0[
            0= n - 1;
                h0[top 
            ++= m0[n-1];
                id0[
            1= 0;
                h0[top 
            ++= m0[0];    
                
            if( sig( m0[1].angle - m0[n-1].angle ) == 0 )
                {
                    id0[top] 
            = 1;
                    h0[top 
            ++= m0[1];      
                }
                
            else
                {
                    
            for(i = 1;i < n; i ++)
                    {
                        
            if(sig(cross(m0[i], h0[top-2], h0[top-1])) > 0)
                        {
                            id0[top] 
            = i;
                            h0[top 
            ++= m0[i];    
                        }
                        
            else
                        {
                            top 
            --;
                            i 
            --;
                        }    
                    }
                }
                len0 
            = top;
                
            }
            void tubao1()
            {
                point a 
            = m1[0];
                
            int j = 0, i;
                
            for(i = 1; i < n; i ++)
                
            if(m1[i].y==a.y&&m1[i].x<a.x || m1[i].y<a.y)
                {
                    j 
            = i;
                    a 
            = m1[i];
                }
                swap(m1[
            0] , m1[j]);    
                m1[
            0].angle = 0;
                
            for(i = 1; i < n; i ++)
                {
                    m1[i].angle 
            = atan2(m1[i].y - m1[0].y, m1[i].x - m1[0].x);
                    m1[i].dis 
            = dist(m1[0], m1[i]);
                }
                sort(m1 
            + 1, m1 + n, cmp);
                
            //for(i=0;i<n;i++)printf("%lf %lf\n",m0[i].x,m0[i].y);
                int top = 0;
                id1[
            0= n - 1;
                h1[top 
            ++= m1[n-1];
                id1[
            1= 0;
                h1[top 
            ++= m1[0];    
                
            if( sig( m1[1].angle - m1[n-1].angle ) == 0 )
                {
                    id1[top] 
            = 1;
                    h1[top 
            ++= m1[1];         
                }
                
            else
                {
                    
            for(i = 1;i < n; i ++)
                    {
                        
            if(sig(cross(m1[i], h1[top-2], h1[top-1])) > 0)
                        {
                            id1[top] 
            = i;
                            h1[top 
            ++= m1[i];    
                        }
                        
            else
                        {
                            top 
            --;
                            i 
            --;
                        }    
                    }
                }
                len1 
            = top;
                
            }

            void pre()
            {
                point tt;
                ray.x 
            = h0[2].x - h0[1].x;
                ray.y 
            = h0[2].y - h0[1].y;
                swap(m0[id0[
            1]], m0[0]);
                m0[
            0].angle = 0;
                m0[
            0].dis = 0;
                
            for(int i = 1; i < n; i ++)
                {
                    tt.x 
            = m0[i].x - m0[0].x;
                    tt.y 
            = m0[i].y - m0[0].y;
                    m0[i].angle 
            = jiajiao(tt, ray);
                    m0[i].dis 
            = dist(m0[0], m0[i]);
                }
                sort(m0 
            + 1,m0 + n, cmp);
            }

            double enum_()
            {
                
            int i, j, flag;
                point tray, tbase, tt;
                
            double angle, minans = 9999999;
                h1[len1] 
            = h1[0];
                
            for(i = 0; i<= len1; i ++)
                {
                    tray.x 
            = h1[i + 1].x - h1[i].x;
                    tray.y 
            = h1[i + 1].y - h1[i].y;
                    angle 
            = jiajiao(tray, ray);
                    
            //printf("ray:%lf %lf tray:%lf %lf angle = %lf\n",ray.x,ray.y,tray.x,tray.y,angle);

                    m1[
            0].angle = 0;
                    m1[
            0].dis = 0;
                    
            for(j = 0; j < n; j ++)
                    {
                        tt.x 
            = m1[j].x - h1[i].x;
                        tt.y 
            = m1[j].y - h1[i].y;
                        m1[j].angle 
            = jiajiao(tt, tray);
                        m1[j].dis 
            = dist(h1[i], m1[j]);
                    }
                    sort(m1, m1 
            + n, cmp);
                    
                    
            //for(j=0;j<n;j++)printf("%lf %lf\n",m1[j].x,m1[j].y); puts("");
                    
            //for(j=0;j<n;j++)printf("%lf %lf\n",m0[j].x,m0[j].y); puts("");
                        
                    flag 
            = 0;
                    
            for(j = 1; j < n; j ++)
                    {
                        
            //printf("%lf %lf %lf %lf\n",m0[j].angle,m1[j].angle,m0[j].dis,m1[j].dis);
                        if(sig(m0[j].angle - m1[j].angle) || sig(m0[j].dis - m1[j].dis))
                        {
                            flag 
            = 1;
                            
            break;
                        }
                    }
                    
            //printf("%d\n",flag);
                    if(!flag)
                    {
                        
            double xx = jiajiao(tray, ray);
                        
            if(sig(minans - xx) > 0) minans = xx;
                    }
                }
                
            return minans;
            }

            int main()
            {
                
            double ans;
                
            int i;
                
            //freopen("in.txt","r",stdin);
                
            //freopen("out.txt","w",stdout);
                while(scanf("%d"&n) , n)
                {    
                    read();
                    
            if(n == 1)
                    {
                        
            double x = 0;
                        printf(
            "%.10lf\n",x);
                        
            continue;
                    }
                    
            if(n == 2)
                    {
                        point a, b, c;
                        a.x 
            = m0[0].x - m0[1].x;    a.y = m0[0].y - m0[1].y;
                        b.x 
            = m0[1].x - m0[0].x;    b.y = m0[1].y - m0[0].y;
                        c.x 
            = m1[0].x - m1[1].x;    c.y = m1[0].y - m1[1].y;
                        printf(
            "%.10lf\n",min(jiajiao(a,c),jiajiao(b,c)));
                        
            continue;
                    }
                    tubao0();
                    tubao1();
                    
            //for(i=0;i<=len0;i++)printf("%lf %lf\n",h0[i].x,h0[i].y);
                    
            //for(i=0;i<=len1;i++)printf("%lf %lf\n",h1[i].x,h1[i].y);
                    pre();
                    ans 
            = enum_();
                    printf(
            "%.10lf\n",ans);
                }
                
            //while(1);
            }

            posted on 2009-08-16 00:52 superlong 閱讀(237) 評論(1)  編輯 收藏 引用

            Feedback

            # re: HOJ 11482 2009-08-16 09:14 csuft1
            呵呵..把代碼發(fā)在這里很不錯..以后我也試試...百度的編輯器太爛了....  回復  更多評論
              

            久久se精品一区二区影院 | 久久国产高清字幕中文| 一日本道伊人久久综合影| 久久免费小视频| 久久精品亚洲欧美日韩久久 | 久久久久久九九99精品| 久久精品国产半推半就| 亚洲午夜久久久久妓女影院| 亚洲一区二区三区日本久久九| 69国产成人综合久久精品| 久久99亚洲网美利坚合众国| 无码久久精品国产亚洲Av影片 | 久久精品免费一区二区三区| 人妻无码精品久久亚瑟影视| 99精品国产在热久久| 久久一区二区三区免费| 激情伊人五月天久久综合| 亚洲精品视频久久久| 91久久福利国产成人精品| 久久久久亚洲国产| 久久91这里精品国产2020| 日韩乱码人妻无码中文字幕久久 | 久久亚洲AV无码精品色午夜麻豆 | av色综合久久天堂av色综合在| 91精品婷婷国产综合久久| 久久亚洲国产成人精品性色| 日韩十八禁一区二区久久| 99久久久久| 青青青国产成人久久111网站| 久久综合88熟人妻| 区久久AAA片69亚洲| 亚洲午夜无码久久久久小说| 国内精品欧美久久精品| 91精品国产91久久久久福利| 欧美牲交A欧牲交aⅴ久久| 精品久久久久久国产| 色99久久久久高潮综合影院| 久久综合九色综合久99| 欧美精品福利视频一区二区三区久久久精品 | 伊人久久大香线蕉av不卡 | 久久国产成人午夜AV影院|