POJ 1113 || HDU 1348: wall(凸包問題)

來源:互聯網
上載者:User

標籤:poj

傳送門:

POJ:點擊開啟連結

HDU:點擊開啟連結


下面是POJ上的題;


Wall
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 29121   Accepted: 9746

Description

Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the King‘s castle. The King was so greedy, that he would not listen to his Architect‘s proposals to build a beautiful brick wall with a perfect shape and nice tall towers. Instead, he ordered to build the wall around the whole castle using the least amount of stone and labor, but demanded that the wall should not come closer to the castle than a certain distance. If the King finds that the Architect has used more resources to build the wall than it was absolutely necessary to satisfy those requirements, then the Architect will loose his head. Moreover, he demanded Architect to introduce at once a plan of the wall listing the exact amount of resources that are needed to build the wall.

Your task is to help poor Architect to save his head, by writing a program that will find the minimum possible length of the wall that he could build around the castle to satisfy King‘s requirements.

The task is somewhat simplified by the fact, that the King‘s castle has a polygonal shape and is situated on a flat ground. The Architect has already established a Cartesian coordinate system and has precisely measured the coordinates of all castle‘s vertices in feet.

Input

The first line of the input file contains two integer numbers N and L separated by a space. N (3 <= N <= 1000) is the number of vertices in the King‘s castle, and L (1 <= L <= 1000) is the minimal number of feet that King allows for the wall to come close to the castle.

Next N lines describe coordinates of castle‘s vertices in a clockwise order. Each line contains two integer numbers Xi and Yi separated by a space (-10000 <= Xi, Yi <= 10000) that represent the coordinates of ith vertex. All vertices are different and the sides of the castle do not intersect anywhere except for vertices.

Output

Write to the output file the single number that represents the minimal possible length of the wall in feet that could be built around the castle to satisfy King‘s requirements. You must present the integer number of feet to the King, because the floating numbers are not invented yet. However, you must round the result in such a way, that it is accurate to 8 inches (1 foot is equal to 12 inches), since the King will not tolerate larger error in the estimates.

Sample Input

9 100200 400300 400300 300400 300400 400500 400500 200350 200200 200

Sample Output

1628

Hint

結果四捨五入就可以了


題意大致就是要你求將所有點包起來的那個面的最小周長, 以及還有一個以L為半徑圓的周長。。

用的是Andrew演算法


</pre><pre name="code" class="cpp">#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<sstream>#include<cmath>using namespace std;#define f1(i, n) for(int i=0; i<n; i++)#define f2(i, m) for(int i=1; i<=m; i++)#define f3(i, n) for(int i=n; i>=0; i--)#define M 1005#define PI 3.1415926struct Point{    double x, y;};void sort(Point *p, int n)   //按照x從小到大排序(如果x相同, 按照y從小到大排序){    Point temp;    f1(i, n-1)    f1(j, n-i-1)    {        if( (p[j].x > p[j+1].x) || (p[j].x==p[j+1].x && p[j].y>p[j+1].y) )        {            temp = p[j];            p[j] = p[j+1];            p[j+1] = temp;        }    }}int cross(int x1, int y1, int x2, int y2)      //看P[i]是否是在其內部。。</span></span>{    if(x1*y2-x2*y1<=0)                        //叉積小於0,說明p[i]在當前前進方向的右邊,因此需要從凸包中刪除c[m-1],c[m-2]</span><span>          return 0;    else        return 1;}double dis(Point a, Point b)//求兩個凸包點之間的長度。。</span><span> {    return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );}int convexhull(Point *p, Point *c, int n){    int m = 0;    f1(i, n)//下凸包</span><span>      {        while( m>1 && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) )            m--;        c[m++] = p[i];    }    int k = m;    f3(i, n-2)//求上凸包</span><span>     {        while( m>k && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) )            m--;        c[m++] = p[i];    }    if(n>1)        m--;    return m;}int main(){    Point a[M], p[M];    double sum;    int n, r;    while( cin>>n>>r )    {        sum=0.0;        f1(i, n)        scanf("%lf %lf", &a[i].x, &a[i].y);        sort (a, n);        int m = convexhull(a, p, n);        f2(i, m)        sum+=dis( p[i], p[i-1] );        sum+=2*PI*r;        printf("%.lf\n", sum);    }      return 0;}



我也不知道為什麼。。我用lf用G++提交就WA, 用c++就AC。。看討論區裡也說用lf提交錯。。把其改為f就對了。。可能G++的輸出預設為f把。。。~~(╯﹏╰)b

下面是HDU上AC的代碼。。之所以貼出來, 是因為PE過一次。。要注意一下格式。。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<sstream>#include<cmath>using namespace std;#define f1(i, n) for(int i=0; i<n; i++)#define f2(i, m) for(int i=1; i<=m; i++)#define f3(i, n) for(int i=n; i>=0; i--)#define M 1005#define PI 3.1415926struct Point{    double x, y;};void sort(Point *p, int n){    Point temp;    f1(i, n-1)    f1(j, n-i-1)    {        if( (p[j].x > p[j+1].x) || (p[j].x==p[j+1].x && p[j].y>p[j+1].y) )        {            temp = p[j];            p[j] = p[j+1];            p[j+1] = temp;        }    }}int cross(int x1, int y1, int x2, int y2){    if(x1*y2-x2*y1<=0)        return 0;    else        return 1;}double dis(Point a, Point b){    return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );}int convexhull(Point *p, Point *c, int n){    int m = 0;    f1(i, n)    {        while( m>1 && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) )            m--;        c[m++] = p[i];    }    int k = m;    f3(i, n-2)    {        while( m>k && !cross(c[m-2].x-c[m-1].x, c[m-2].y-c[m-1].y, c[m-2].x-p[i].x, c[m-2].y-p[i].y) )            m--;        c[m++] = p[i];    }    if(n>1)        m--;    return m;}int main(){    Point a[M], p[M];    double sum;    int t;    while( cin>>t )    {        while( t-- )        {            sum=0.0;            int n, r;            cin>>n>>r;            f1(i, n)            scanf("%lf %lf", &a[i].x, &a[i].y);            sort (a, n);            int m = convexhull(a, p, n);            f2(i, m)            sum+=dis( p[i], p[i-1] );            sum+=2*PI*r;            printf("%.lf\n", sum);            if(t)                printf("\n");        }    }    return 0;}






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.