滴水穿石,慢慢积累,总会有成果

随手记录,持之以恒

HDOJ 5563 Clarke and five-pointed star (判断五个点组成的是否为正五角星)

Clarke and five-pointed star

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 420    Accepted Submission(s): 227


Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke turned into a learner of geometric.
When he did a research with polygons, he found he has to judge if the polygon is a five-pointed star at many times. There are 5 points on a plane, he wants to know if a five-pointed star existed with 5 points given.
 

Input
The first line contains an integer T(1T10), the number of the test cases.
For each test case, 5 lines follow. Each line contains 2 real numbers xi,yi(109xi,yi109), denoting the coordinate of this point.
 

Output
Two numbers are equal if and only if the difference between them is less than104.
For each test case, print Yes if they can compose a five-pointed star. Otherwise, print No. (If 5 points are the same, print Yes. )
 

Sample Input
2 3.0000000 0.0000000 0.9270509 2.8531695 0.9270509 -2.8531695 -2.4270509 1.7633557 -2.4270509 -1.7633557 3.0000000 1.0000000 0.9270509 2.8531695 0.9270509 -2.8531695 -2.4270509 1.7633557 -2.4270509 -1.7633557
 

Sample Output
Yes No
Hint
题意:给你5个点,求这5个点能不能连成一个正五角星 思路:见每个点都连起来会发现,会组成一个五边形,而正五角星组成的是正五边形,所一说此题就转化为判断是否 能组成正五边形直接枚举距离,正多边形个点之间的连线中边长一定是最短的那条边,所以我们只需要查看最短边数 量是否等于5就可以判断是不是正五边形,也就能判断能不能组成正五角星。需要注意的是精度问题。可能这道题数 据有点弱,窝水了过去,正式的应该是先求凸包,然后在判断,但是可能因为精度问题水了过去。。 类似的题有:点击打开链接 ac代码:  
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stack>
#include<iostream>
#include<algorithm>
#define fab(a) (a)>0?(a):(-a)
#define LL long long
#define MAXN 1000010
#define mem(x) memset(x,0,sizeof(x))
#define INF 0xfffffff 
using namespace std;
struct s
{
	double x,y;
}a[10];
int v[10][10];
double dis[1000];
double fun(s aa,s bb)
{
	return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y));
}
int main()
{
	int t,i,j;
	scanf("%d",&t);
	while(t--)
	{
		for(i=0;i<5;i++)
		scanf("%lf%lf",&a[i].x,&a[i].y);
		mem(v);
		int k=0;
		double mi=1.0*INF;
		for(i=0;i<5;i++)
		{
			for(j=i+1;j<5;j++)
			{
				if(v[i][j]||v[j][i])
				continue;
				dis[k]=fun(a[i],a[j]);
				mi=min(mi,dis[k]);
				v[i][j]=1; 
				k++;
			}
		}
		int cnt=0;
		for(i=0;i<k;i++)
		{
			if(dis[i]-mi<=1e-4)//精度问题
			cnt++;
		}
		if(cnt==5)
		printf("Yes\n");
		else
		printf("No\n");
	}
	return 0;
}




 
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/helloiamclh/article/details/49889277
上一篇HDOJ 5562 Clarke and food
下一篇HDOJ 1251 统计难题 (字典树)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭