#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iostream>
#define maxn 100 + 10
using namespace std;
struct Point{
int x, y;
bool operator < (const Point &a) const{
if(x == a.x) return y < a.y;
return x < a.x;
}
Point operator + (const Point &a) const{
Point t;
t.x = x+a.x; t.y = y+a.y;
return t;
}
Point operator - (const Point &a) const{
Point t;
t.x = x-a.x; t.y = y-a.y;
return t;
}
}p[maxn], ch[maxn];
double di(Point a1, Point a2, Point a)
{
double xx = fabs((a2.x-a1.x)*a.y - (a2.y-a1.y)*a.x - (a2.x - a1.x)*a1.y + (a2.y-a1.y)*a1.x);
double yy = sqrt((a2.x-a1.x)*(a2.x-a1.x)+(a2.y-a1.y)*(a2.y-a1.y));
return xx/yy;
}
double Cross(Point a, Point b)
{
return a.x*b.y-a.y*b.x;
}
int ConvexHull(Point *p, int n, Point *ch)
{
sort(p, p+n);
int m = 0;
for(int i = 0; i < n; ++i){
while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) --m;
ch[m++] = p[i];
}
int k = m;
for(int i = n-2; i >= 0; --i)
{
while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) --m;
ch[m++] = p[i];
}
if(n > 1) --m;
return m;
}
int main()
{
int n, kase = 0;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break;
for(int i = 0; i < n; ++i)
scanf("%d%d", &p[i].x, &p[i].y);
n = ConvexHull(p, n, ch);
double ans;
for(int i = 0; i < n; ++i)
{
double maxdis = -1.0;
for(int j = 0; j < n; ++j)
{
if(j == (i%n) || j == ((i+1)%n)) continue;
double dist = di(ch[i%n], ch[(i+1)%n], ch[j]);
if(maxdis < 0) maxdis = dist;
else maxdis = max(dist, maxdis);
}
if(i == 0) ans = maxdis;
else ans = min(maxdis, ans);
}
printf("Case %d: %.2lf\n", ++kase, ans);
}
return 0;
}
uva 1111 - Trash Removal
最新推荐文章于 2019-02-11 19:58:00 发布