Poj 1113 Wall(凸包)
程序员文章站
2022-03-29 22:47:23
...
题目链接
解析:凸包问题,城堡各点构成的一个凸包,结果就是凸包周长加上一个以要求的距离为半径的圆周(任意凸多边形的外角和都是)
总结:1. 成员函数的构造。 2. 四舍五入:(int)(ans + 0.5)。 3. sqrt的参数必须是浮点型。 4. 即使输入的是整数,在计算边长还是会变成小数,用int会影响精度问题。 5. 一组测试数据
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1005;
int n, l;
struct Point
{
int x, y;
Point(int x=0, int y=0): x(x), y(y) {}; //方便后面(,)形式的书写
bool operator < (const Point& a) const
{
return (x < a.x) || (x == a.x && y < a.y);
}
}ch[maxn], p[maxn];
typedef Point Vector;
Vector operator - (Point a, Point b){
return Vector(a.x-b.x, a.y-b.y);
}
double Dot(Vector a, Vector b){
return a.x*b.x + a.y*b.y;
}
double Length(Vector a){
return sqrt(Dot(a, a));
}
int Cross(Vector a, Vector b){
return a.x*b.y - a.y*b.x;
}
int ConvexHull(Point* p, Point* ch)
{
sort(p, p+n);
int top = 0;
for(int i = 0; i < n; ++ i)
{
while(top > 1 && Cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]) <= 0) top --;
ch[top ++] = p[i];
}
int k = top;
for(int i = n-2; i >= 0; -- i)
{
while(top > k && Cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]) <= 0) top --;
ch[top ++] = p[i];
}
if(n > 1) top --;
return top;
}
void solve(int top)
{
double ans = 0;
for(int i = 0; i < top; ++ i){
ans += Length(ch[(i+1)%top]-ch[i]);
}
ans += 3.1415926*2*l;
printf("%d\n",(int)(ans + 0.5));
}
int main()
{
scanf("%d%d", &n, &l);
for(int i = 0; i < n; ++ i)
{
scanf("%d%d", &p[i].x, &p[i].y);
}
int cnt = ConvexHull(p, ch);
solve(cnt);
return 0;
}
上一篇: 浮动(CSS笔记)