볼록 가방
void getLineGeneralEquation(const Point& p1, const Point& p2, double& a, double& b, double &c)
{
a = p2.y - p1.y;
b = p1.x - p2.x;
c = -a * p1.x - b * p1.y;
}
직선의 두 점 식 을 일반 식 으로 바 꿔 라, 응, 주의해 야 할 것 이 없다.
#include <bits/stdc++.h>
using namespace std;
struct Point
{
double x, y;
Point(double x = 0, double y = 0): x(x), y(y) { }
};
typedef Point Vector;
Vector operator - (const Point& A, const Point& B)
{
return Vector(A.x - B.x, A.y - B.y);
}
double Cross(const Vector& A, const Vector& B)
{
return A.x * B.y - A.y * B.x;
}
bool operator < (const Point& p1, const Point& p2)
{
return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y);
}
bool operator == (const Point& p1, const Point& p2)
{
return p1.x == p2.x && p1.y == p2.y;
}
vector<Point> ConvexHull(vector<Point> p)
{
// ,
sort(p.begin(), p.end());
p.erase(unique(p.begin(), p.end()), p.end());
int n = p.size();
int m = 0;
vector<Point> ch(n + 1);
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--;
ch.resize(m);
return ch;
}
void getLineGeneralEquation(const Point& p1, const Point& p2, double& a, double& b, double &c)
{
a = p2.y - p1.y;
b = p1.x - p2.x;
c = -a * p1.x - b * p1.y;
}
int T, N, kase;
double x, y, A, B, C;
int main(int argc, char const *argv[])
{
scanf("%d", &T);
while (T--)
{
scanf("%d", &N);
vector<Point>P;
double sumx = 0, sumy = 0, ans = 1E9;
for (int i = 0; i < N; i++)
{
scanf("%lf%lf", &x, &y);
sumx += x, sumy += y;
P.push_back(Point(x, y));
}
vector<Point>ch = ConvexHull(P);
if (ch.size() <= 2) ans = 0;
else for (int i = 0; i < ch.size(); i++)
{
getLineGeneralEquation(ch[i], ch[(i + 1) % ch.size()], A, B, C);
ans = min(ans, fabs(A * sumx + B * sumy + C * N) / sqrt(A * A + B * B));
}
printf("Case #%d: %.3lf
", ++kase, ans / N);
}
return 0;
}
모든 점 은 이 직선의 같은 쪽 에 있 는데 볼록 가방 의 가장 자 리 를 직접 이용 하 는 것 이 분명 하 다.그래서 돌출 된 가방 의 모든 변 을 매 거 한 다음 에 거리 와.
두 점 식 을 일반 식 으로 바 꾼 후에 순환 할 필요 가 없다. 모든 x 와 y 를 각각 더 해서 방정식 에 가 져 가면 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.