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

            Uriel's Corner

            Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
            posts - 0, comments - 50, trackbacks - 0, articles - 594
                    慚愧,這題從中午寫到晚上,一開(kāi)始一直卡著調(diào)也調(diào)不了,搞到晚上沒(méi)辦法換了個(gè)凸包模板,然后歷經(jīng)各種NC錯(cuò)誤終于AC。。                                                          
                    浙大模板凸包那里應(yīng)該沒(méi)什么問(wèn)題,用過(guò)多少次了,應(yīng)該是自己寫掛了吧。。- -             
                    題意是有n棵樹(shù),每棵的坐標(biāo),價(jià)值和長(zhǎng)度已知,要砍掉若干根,用他們圍住其他樹(shù),問(wèn)損失價(jià)值最小的情況下又要長(zhǎng)度足夠圍住其他樹(shù),砍掉哪些樹(shù)。。                                
                     Discuss稱這題為Final的水題。。于是我也水過(guò)去了。。枚舉+構(gòu)造凸包判可行。。代碼如下。。凸包那里可以無(wú)視。。- -直接貼模板的。。
            /*
            Problem: 1873        User: Uriel
            Memory: 192K        Time: 454MS
            Language: C++        Result: Accepted
            */

            #include
            <math.h>
            #include
            <stdio.h>
            #include
            <stdlib.h>
            #include
            <algorithm>
            using namespace std;

            struct point
            {
                
            int flag;
                
            double x,y,v,l;
            }
            ;

            point P[
            100],convex[100],p1[100],p2[100],p[100];
            double resl,suml,sumv,minv,ans;
            int n,ansn;

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


            double multiply(const point& sp,const point& ep,const point& op) 
            {
                  
            return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
            }


            bool cmp(point a,point b)
            {
                
            return a.flag < b.flag;
            }


            int partition(point a[],int p,int r) 
            {
                
            int i=p,j=r+1,k;
                
            double ang,dis;
                point R,S;
                k
            =(p+r)/2;
                R
            =a[p];a[p]=a[k];a[k]=R;R=a[p];
                dis
            =Dis(R,a[0]);
                
            while(1
                
            {
                    
            while(1
                    
            {
                        
            ++i;
                        
            if(i>r) 
                        
            {
                            i
            =r;
                            
            break;
                        }

                        ang
            =multiply(R,a[i],a[0]);
                        
            if(ang>0)
                            
            break;
                        
            else if(ang==0
                        
            {
                            
            if(Dis(a[i],a[0])>dis)
                            
            break;
                        }

                    }

                    
            while(1
                    
            {
                         
            --j;
                        
            if(j<p) 
                        
            {
                            j
            =p;
                            
            break;
                        }

                        ang
            =multiply(R,a[j],a[0]);
                        
            if(ang<0)
                            
            break;
                        
            else if(ang==0
                        
            {
                            
            if(Dis(a[j],a[0])<dis)
                                
            break;
                        }

                    }

                    
            if(i>=j)break;
                    S
            =a[i];
                    a[i]
            =a[j];
                    a[j]
            =S;
                }

                a[p]
            =a[j];
                a[j]
            =R;
                
            return j;
            }


            void anglesort(point a[],int p,int r) 
            {
                
            if(p<r) 
                
            {
                    
            int q=partition(a,p,r);
                    anglesort(a,p,q
            -1);
                    anglesort(a,q
            +1,r);
                }

            }


            /*PointSet傳入散點(diǎn),凸包上的點(diǎn)存在ch,n為點(diǎn)數(shù),len為凸包頂點(diǎn)數(shù)*/
            void Graham_scan(point PointSet[],point ch[],int n,int &len) 
            {
                
            int i,k=0,top=2;
                point tmp;
                
            for(i=1;i<n;i++)
                    
            if ( PointSet[i].x<PointSet[k].x ||
                        (PointSet[i].x
            ==PointSet[k].x) && (PointSet[i].y<PointSet[k].y))
                           k
            =i;
                tmp
            =PointSet[0];
                PointSet[
            0]=PointSet[k];
                PointSet[k]
            =tmp;
                anglesort(PointSet,
            1,n-1);
                
            if(n<3
                
            {
                    len
            =n;
                    
            for(int i=0;i<n;i++) ch[i]=PointSet[i];
                    
            return ;
                }

                ch[
            0]=PointSet[0];
                ch[
            1]=PointSet[1];
                ch[
            2]=PointSet[2];
                
            for (i=3;i<n;i++
                
            {
                    
            while (multiply(PointSet[i],ch[top],ch[top-1])>=0) top--;
                     ch[
            ++top]=PointSet[i];
                }

                len
            =top+1;
            }


            int main()
            {
                
            int cse,g=1,i,j,k1,M,k2;
                
            while(scanf("%d",&n),n)
                
            {
                    
            for(i=0;i<n;i++)
                    
            {
                        scanf(
            "%lf %lf %lf %lf",&P[i].x,&P[i].y,&P[i].v,&P[i].l);
                        P[i].flag
            =i+1;
                    }

                    minv
            =1e20;
                    
            for(i=0;i<(1<<n);i++)
                    
            {
                        k1
            =0;k2=0;
                        sumv
            =0;suml=0;
                        
            for(j=0;j<n;j++)
                        
            {
                            
            if(!(i & (1<<j)))
                            
            {
                                p1[k1].x
            =P[j].x;
                                p1[k1].y
            =P[j].y;
                                k1
            ++;
                            }

                            
            else
                            
            {
                                p2[k2].flag
            =P[j].flag;
                                sumv
            +=P[j].v;
                                suml
            +=P[j].l;
                                k2
            ++;
                            }

                        }

                        Graham_scan(p1,convex,k1,M);
                        resl
            =0;
                        
            for(int j=0;j<M-1;j++)
                        
            {
                            resl
            +=Dis(convex[j],convex[j+1]);
                        }

                        resl
            +=Dis(convex[0],convex[M-1]);
                        
            if(resl<=suml && sumv<minv)
                        
            {
                            ans
            =suml-resl;
                            minv
            =sumv;
                            ansn
            =k2;
                            
            for(j=0;j<k2;j++)p[j].flag=p2[j].flag;
                        }

                    }

                    printf(
            "Forest %d\n",g++);
                    printf(
            "Cut these trees:");
                    
            for(i=0;i<ansn;i++)if(p[i].flag!=p[i-1].flag)printf(" %d",p[i].flag);
                    printf(
            "\n");
                    printf(
            "Extra wood: %.2lf\n\n",ans);
                }

            //    system("PAUSE");
                return 0;
            }

            Feedback

            # re: POJ 1873 The Fortified Forest---凸包+枚舉  回復(fù)  更多評(píng)論   

            2012-03-20 20:24 by debuger
            5
            1 1 2 2
            2 2 3 3
            3 3 4 4
            4 4 5 5
            5 5 6 6
            崩潰數(shù)據(jù)

            # re: POJ 1873 The Fortified Forest---凸包+枚舉  回復(fù)  更多評(píng)論   

            2012-03-20 21:02 by Uriel
            @debuger
            謝謝提醒,原來(lái)沒(méi)有考慮共線的情況,有共線時(shí)凸包那里會(huì)有bug
            似乎改成這樣就可以
            while (multiply(PointSet[i], ch[top], ch[top - 1]) >= 0 && top >= 1) top--;
            還有問(wèn)題的話歡迎指教~
            亚洲午夜久久久久久久久久| 亚洲а∨天堂久久精品9966| 久久亚洲精精品中文字幕| 久久久久波多野结衣高潮| 中文国产成人精品久久亚洲精品AⅤ无码精品| 麻豆精品久久精品色综合| 国产精品无码久久综合网| 亚洲性久久久影院| 国产A三级久久精品| 青青青伊人色综合久久| 久久99久久99精品免视看动漫 | 国内精品久久久久久久涩爱| 欧美久久久久久精选9999| 77777亚洲午夜久久多人| 办公室久久精品| 久久久久久久亚洲Av无码| 久久亚洲AV无码西西人体| 久久精品国产亚洲AV嫖农村妇女 | 久久精品国产亚洲一区二区三区 | 蜜臀av性久久久久蜜臀aⅴ | 精品国产乱码久久久久久1区2区| 久久精品成人| 免费观看久久精彩视频| 一本久久知道综合久久| 久久亚洲视频| 国产免费久久精品丫丫| 久久96国产精品久久久| 色偷偷88888欧美精品久久久| 亚洲国产精品成人AV无码久久综合影院| 精品久久无码中文字幕| 亚洲中文久久精品无码ww16 | 久久91这里精品国产2020| 青草影院天堂男人久久| 精品久久8x国产免费观看| 久久久久亚洲AV无码麻豆| 久久影院综合精品| 久久精品欧美日韩精品| 久久国产精品99国产精| 久久久久人妻一区精品性色av| 久久久久久九九99精品| 97久久精品无码一区二区|