kyeremal-poj1113-Wall-凸包

poj1113-Wall


Wall

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 31394   Accepted: 10610

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 100
200 400
300 400
300 300
400 300
400 400
500 400
500 200
350 200
200 200

Sample Output

1628

Hint

结果四舍五入就可以了

Source

Northeastern Europe 2001

题意:给定N个点,求最小的图形,使得所有点均在凸多边形内,且任一点到凸多边形的距离不小于L,求图形最小的周长.

首先想到凸包.

但是有距离不小于L的限制,那么考虑以每个点作一个半径为L的圆.

那么最终图形一定包含所有的N个圆.

最终图形包括直线和弧.

直线便与圆相切,切对应直线的∑长度=凸包周长,

接下来考虑∑弧长,每一段弧都对应一个转折点.

考虑圆上的一点i,经过每一段弧后回到原来的位置.

即∑弧长=以L为半径的圆的周长.

那么最终答案 = 凸包周长 + 2×π×R.

code:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>

using namespace std;

#define rep(i, l, r) for (int i = l; i <= r; i++)
#define REP(i, l, r) for (int i = l; i >= r; i--)
#define PI (3.14159265358979323846264)
#define INF 19971228
#define MAXN 1010

int n, L, stack[MAXN], top;
struct point {int x, y;} a[MAXN], p0;

point operator -(point a, point b) {a.x = a.x - b.x, a.y = a.y - b.y; return a;}
int operator ^(point a, point b) {return a.x*b.y - a.y*b.x;}
int operator *(point a, point b) {a = a - p0, b = b - p0; return a^b;}

inline int sqr(int x) {return x*x;}
inline double dist(point a, point b) {return sqrt(sqr(a.y-b.y) + sqr(a.x-b.x));}
inline bool cmp(point a, point b) {
    if (a*b > 0) return 1;
    else if (a*b == 0 && dist(a, p0) < dist(b, p0)) return 1;
    return 0;
}

inline bool left(point a, point b, point c) {
    point v1, v2;
    v1.x = b.x - a.x, v1.y = b.y - a.y;
    v2.x = c.x - b.x, v2.y = c.y - b.y;
    return (v1^v2) > 0;
}

inline void graham() {
    a[++n] = a[1];
    top = 0;
    stack[++top] = 1;
    stack[++top] = 2;
    stack[++top] = 3;
    rep(i, 4, n) {
	while (!left(a[stack[top-1]], a[stack[top]], a[i])) top--;
	stack[++top] = i;
    }
}

int main() {
    cin >> n >> L;
    int minx = INF, miny = INF, k;
    rep(i, 1, n) {
	scanf("%d%d", &a[i].x, &a[i].y);
	if (a[i].x < minx || (a[i].x == minx && a[i].y < miny)) minx = a[i].x, miny = a[i].y, k = i;
    }
    p0.x = minx, p0.y = miny;
    sort(a+1, a+1+n, cmp);
    graham();
    double ans = 0;
    rep(i, 2, top) ans += dist(a[stack[i-1]], a[stack[i]]);
    ans += 2 * PI * L;
    printf("%d\n", int(ans + 0.5));

    return 0;
}
时间: 2024-10-10 21:37:59

kyeremal-poj1113-Wall-凸包的相关文章

poj1113 Wall 凸包

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 perfec

POJ1113 Wall【凸包】

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24604   Accepted: 8183 Description King想在自己的n个城堡外建Wall,使Wall与任一城堡距离至少为L且能围住它的城堡. 求Wall最短长度. Input 第一行为 N (3 <= N <= 1000) 和 L(1 <= L <= 1000). 接下来 N 行,每行为城堡坐标Xi,Yi (-10000 <=

[poj1113][Wall]

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 perfec

POJ 1113 - Wall 凸包模板

此题为凸包问题模板题,题目中所给点均为整点,考虑到数据范围问题求norm()时先转换成double了,把norm()那句改成<vector>压栈即可求得凸包. 初次提交被坑得很惨,在GDB中可以完美运行A掉,到OJ上就频频RE(此处应有黑人问号) 后来发现了问题,原因是玩杂耍写了这样的代码 struct point { int x, y; point (){ scanf("%d%d", &x, &y); } ... }pt[MAXN]; 于是乎,在swap

[POJ1113&amp;POJ1696]凸包卷包裹算法和Graham扫描法应用各一例

凸包的算法比较形象好理解 代码写起来也比较短 所以考前看一遍应该就没什么问题了..>_< POJ1113 刚开始并没有理解为什么要用凸包,心想如果贴着城堡走不是更好吗? 突然发现题目中有要求在满足把所有点包括在内的情况下周长最短...这不就是凸包的性质吗? 而且显然如果城堡是凹的话,往里面绕一圈肯定会使周长增加... 然后可以从简单的三角形四边形推广出去,发现每个拐角-左右各90度之后所有的加和为180度 也就是在城堡周长的基础上再加一个半径为L的圆周长即是所求答案. 上次的模板写错了...应

hdu 1348 Wall (凸包)

Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3139    Accepted Submission(s): 888 Problem Description Once upon a time there was a greedy King who ordered his chief Architect to build a w

poj 1113 Wall (凸包模板题)

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32808   Accepted: 11137 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 w

【POJ 1113】 Wall (凸包)

[POJ 1113] Wall 给n个点 连出一个凸包 然后在凸包外筑墙 要求墙与凸包每一处的距离都>=l 问需要建的最短的墙长 乍一看挺难 画画图就能看出来 凸包外建距离l的墙 其实就是在凸包每个顶点处 以顶点为圆心 做半径为l的弧 做到两侧半径与点的两边平行即可 然后把这些弧都用直线衔接 就是最短墙长 这样还不好求 呢把弧拿出来呢 其实就相当于把整个凸包作为一个点 以该点为圆心 l为半径做了个圆 这样弧的总长就是2*PI*l 那剩下的就是直线 平移下来其实就是凸包的周长 然后卷包裹法或者扫描

HDOJ 1348 Wall 凸包

Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4001    Accepted Submission(s): 1131 Problem Description Once upon a time there was a greedy King who ordered his chief Architect to build a

POJ 1113 Wall (凸包)

题目地址:POJ 1113 先求出凸包的周长,然后剩下的弧合起来一定是个半径为l的圆,然后再加上以l为半径的圆的周长即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <