HDU 5533
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5533
题意:
给出来n个(n<=100)个点,问这些点能不能构成一个正n凸多边形。
思路:
复现的时候没看,补题一下过了……
刚开始想用凸包套,后来抱着水一发的心态试了一下“如果一个点能连接到其他点的最小边和次小边都相等且所有点的最小边都相等就是YES”,然后就A了。
源码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define inf (1000000007)
const int MAXN = 100 + 5;
double x[MAXN], y[MAXN];
double dis(double x1, double y1, double x2, double y2)
{
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
double e1[MAXN], e2[MAXN];
int main()
{
int T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
for(int i = 0 ; i < n ; i++)
scanf("%lf %lf", &x[i], &y[i]);
for(int i = 0 ; i < n ; i++)
e1[i] = e2[i] = inf;
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
if(i == j) continue;
double temp = dis(x[i], y[i], x[j], y[j]);
if(e1[i] >= temp){
e2[i] = e1[i], e1[i] = temp;
}
else if(e2[i] > temp){
e2[i] = temp;
}
}
}
int ok = 1;
for(int i = 0 ; i < n ; i++){
if(e1[i] != e2[i]){
ok = 0;
break;
}
}
sort(e1, e1 + n);
if(e1[0] != e1[n - 1]) ok = 0;
if(ok) printf("YES\n");
else printf("NO\n");
}
return 0;
}