Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:一定要排序吗?题目中数据是按clockwise给的,能利用这个不排序吗?

Posted by flushtime at 2007-06-20 18:04:35 on Problem 1113
In Reply To:一定要排序吗?题目中数据是按clockwise给的,能利用这个不排序吗? Posted by:ericsummer at 2006-02-10 11:02:50
同问,我用的是Melkman,为什么不排序就通不过呢?


//*****************
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner s =new Scanner(System.in);
        int N =s.nextInt(), L =s.nextInt();
        Point[] pg =new Point[N];
        for(int i=0;i<N;i++){
            int x =s.nextInt();
            int y =s.nextInt();
            pg[i] =new Point(x,y);
        }
        java.util.Arrays.sort(pg);       //为什么需要排序呢?
        Point[] convex =new Point[N+1];
        int size =getPolygonConvexClosure(pg,0,N,convex,0);
        convex[size] =convex[0];
        double dist =0;
        for(int i=0;i<size;i++) dist += Math.sqrt(Point.distanceSq(convex[i],convex[i+1]));
        dist += 2*Math.PI*L;
        System.out.print(Math.round(dist));
    }
    public static int getPolygonConvexClosure(Point[] pg,int fromIndex,int toIndex,Point[] convex,int offset){
        int len =toIndex -fromIndex;
        Point[] tmp =new Point[2*len];
        tmp[len] =pg[fromIndex];
        tmp[len+1] =pg[fromIndex+1];
        tmp[len+2] =pg[fromIndex+2];
        tmp[len-1] =tmp[len+2];
        if(multiply(tmp[len],tmp[len+1],tmp[len+2])<0){
            tmp[len+1] =pg[fromIndex];
            tmp[len  ] =pg[fromIndex+1];
        }
        int tail =len-2, head =len+3;
        for(int index=fromIndex+3;index<toIndex;index++){
            tmp[tail] =tmp[head] =pg[index];
            if(multiply(tmp[head-2],tmp[head-1],tmp[head])>=0&&
                 multiply(tmp[tail+2],tmp[tail+1],tmp[tail])<=0) continue;
            while(multiply(tmp[head-2],tmp[head-1],tmp[head])<0){
                tmp[head-1] =tmp[head];
                head --;
            }
            while(multiply(tmp[tail+2],tmp[tail+1],tmp[tail])>0){
                tmp[tail+1] =tmp[tail];
                tail++;
            }
            tail --;
            head ++;
        }
        System.arraycopy(tmp,tail+1,convex,offset,head-tail-2);
        return head -tail -2;
    }
    private static int multiply(Point a,Point b,Point c){
        return multiply(a,b,a,c);
    }
    /**
    * 计算向量ab与cd的叉积
    */
    private static int multiply(Point a,Point b,Point c,Point d){
        return (b.x-a.x)*(d.y-c.y)-(d.x-c.x)*(b.y-a.y);
    }
}
class Point implements Comparable<Point>{
    public int x,y;
    public static int distanceSq(Point p1,Point p2){
        return (p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y);
    }
    public Point(){
        this(0,0);
    }
    public Point(int x,int y){
        this.x =x;
        this.y =y;
    }
    /**
    * 实现Comparable的compareTo方法,将Point按从左到右,从下到上排序
    */
    public int compareTo(Point p){
        return x ==p.x?y-p.y:x-p.x;
    }
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator