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

结果四舍五入就可以了

Solution

凸包模板题,这里用水平序+上下凸壳求图包

orz clover_hxy

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 3010
#define Eps 1e-18
#define Pi 3.1415926535

using namespace std;

struct Vctor{
  double x, y;

  Vctor() {}

  Vctor(double _x, double _y) : x(_x), y(_y) {}

  bool operator == (const Vctor b)const {return x == b.x && y == b.y;}

  bool operator < (const Vctor b)const {return x < b.x || (x == b.x && y < b.y);}
} d[MAXN], _pb[MAXN], e[MAXN];

Vctor operator + (Vctor a, Vctor b) {return Vctor(a.x + b.x, a.y + b.y);}

Vctor operator - (Vctor a, Vctor b) {return Vctor(a.x - b.x, a.y - b.y);}

Vctor operator * (Vctor a, double b) {return Vctor(a.x * b, a.y * b);}

Vctor operator / (Vctor a, double b) {return Vctor(a.x / b, a.y / b);}

double Dot(Vctor a, Vctor b) {return a.x * b.x + a.y * b.y;}

double Cro(Vctor a, Vctor b) {return a.x * b.y - a.y * b.x;}

int Cmp(double x){
  if(fabs(x) < Eps)return 0;
  return x < 0 ? -1 : 1;
}

double Dis(Vctor a) {return sqrt(Dot(a, a));}

double ans;
int n, L, top;

void Samsara(){
  sort(d, d + n);
  int k;
  for(int i = 0; i < n; i++){
    while(top > 1 && Cmp(Cro(_pb[top - 1] - _pb[top - 2], d[i] - _pb[top - 2])) <= 0)top--;
    _pb[top++] = d[i];
  }
  k = top;
  for(int i = n - 2; i >= 0; i--){
    while(top > k && Cmp(Cro(_pb[top - 1] - _pb[top - 2], d[i] - _pb[top - 2])) <= 0)top--;
    _pb[top++] = d[i];
  }
  if(n > 1)top--;
}

int main(){
  scanf("%d%d", &n, &L);
  for(int i = 0; i < n; i++)
    scanf("%lf%lf", &d[i].x, &d[i].y);
  Samsara();
  for(int i = 1; i <= top; i++)
    e[i] = _pb[i] - _pb[i - 1];
  e[top + 1] = _pb[0] - _pb[top];
  for(int i = 1; i <= top + 1; i++)
    ans += Dis(e[i]);
  ans += Pi * L * 2;
  printf("%.0lf\n", ans);
  return 0;
}
时间: 2024-10-08 04:50:19

[poj1113][Wall]的相关文章

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分类解题报告索引

图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Journey poj1724 - ROADS(邻接表+DFS) BFS poj3278 - Catch That Cow(空间BFS) poj2251 - Dungeon Master(空间BFS) poj3414 - Pots poj1915 - Knight Moves poj3126 - Prim

Graham Scan凸包算法

获得凸包的算法可以算是计算几何中最基础的算法之一了.寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包. 首先介绍一下二维向量的叉积(这里和真正的叉积还是不同的):对于二维向量a=(x1,y2)和b=(x2,y2),a×b定义为x1*y2-y1*x2.而它的几何意义就是|a||b|sin<a,b>.如果a与b夹角小于180度(逆时针),那么这个值就是正值,大于180度就是负值.需要注意的是,左乘和右乘是不同的.如图所示:

【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 p

poj1113(Wall)

题目地址:Wall 题目大意: 一个多边形,由题目给出的坐标构成,然后在多边形外r米处建立围墙将多边形围起来,求花费. 解题思路: 凸包路径+半径为r的圆周长(因为是封闭的图形,所以最终各边转角会构成圆). 两个算法: 1.卷包裹法 : 代码: 1 //找到一个点,看是否右侧有点,有则从新找点,如果该点右侧没有点,则是凸包上的一点,每次都找到最右边的一条边 2 3 #include<stdio.h> 4 #include<algorithm> 5 #include<strin

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

hdu 1348 Wall(凸包模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3386    Accepted Submission(s): 968 Problem Description Once upon a time there was a gre

HDU2124 Repair the Wall(贪心)

Problem Description Long time ago , Kitty lived in a small village. The air was fresh and the scenery was very beautiful. The only thing that troubled her is the typhoon. When the typhoon came, everything is terrible. It kept blowing and raining for