`
xxx0624
  • 浏览: 31745 次
文章分类
社区版块
存档分类
最新评论

POJ2526+简单几何

 
阅读更多

题意:给定的这些点是否有一个对称中心。

PS:我写得有点啰嗦。。。。我也就写写这么挫的东东。。。

就是把小的x和大的x进行匹配。

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;

const double eps = 1e-8;
const int maxn = 10005;

struct Point{
	double x,y;
};
Point pnt1[ maxn ],pnt2[ maxn ];
Point cc;

int cmp1( Point a,Point b ){
	return a.x<b.x;
}

int cmp2( Point a,Point b ){
	return a.y<b.y;
}

int cmp3( Point a,Point b ){
	return a.x>b.x;
}

bool NotOnePoint( Point a,Point b ){
	if( fabs(a.x-b.x)<=eps&&fabs(a.y-b.y)<=eps ) return false;
	else return true;
}

bool OK( Point a,Point b ){
	if( fabs((a.x+b.x)-(2.0*cc.x))<=eps && fabs((a.y+b.y)-(2.0*cc.y))<=eps ) return true;
	else return false;
}

bool Notcc( Point a ){
	if( fabs(a.x-cc.x)<=eps&&fabs(a.y-cc.y)<=eps ) return true;
	else return false;
}

int main(){
	int n;
	int T;
	//freopen("in.txt","r",stdin);
	scanf("%d",&T);
	while( T-- ){
		scanf("%d",&n);
		for( int i=1;i<=n;i++ ){
			scanf("%lf%lf",&pnt1[i].x,&pnt1[i].y);
			pnt2[ i ] = pnt1[ i ];
		}
		if( n==2 ){
			puts("yes");
			continue;
		}
		sort( pnt1+1,pnt1+1+n,cmp1 );
		cc.x = (pnt1[1].x+pnt1[n].x)/2.0;
		sort( pnt2+1,pnt2+1+n,cmp2 );
		cc.y = (pnt2[1].y+pnt2[n].y)/2.0;
		sort( pnt2+1,pnt2+1+n,cmp3 );

		int cnt = 0;
		if( n%2==1 ){
			for( int i=1;i<=n;i++ ){
				if( pnt1[i].x==cc.x&&pnt1[i].y==cc.y ){
					cnt++;
				}
			}
		}
		if( (n-cnt)%2==1 ){
			puts("no");
			continue;
		}
		if( n==cnt ){
			puts("yes");
			continue;
		}
		//printf("cc:x = %lf,y = %lf\n",cc.x,cc.y);
		/*
		for( int i=1;i<=n;i++ ){
			printf("x = %lf \n",pnt1[i].x);
		}
		for( int i=1;i<=n;i++ ){
			printf("x = %lf \n",pnt2[i].x);
		}
		*/
		int tt = 0;
		int N = n - cnt;//N%2=0
		for( int i=1;i<=(n/2)&&tt<(N/2);i++ ){
			tt++;
			//printf(" i =%d ",i);
			//printf("pnt1:x = %lf y = %lf\n",pnt1[i].x,pnt1[i].y);
			bool find = false;
			for( int j=1;j<=(n/2);j++ ){
				//printf(" j = %d \n",j);
				//printf("pnt2:x = %lf y = %lf\n",pnt2[j].x,pnt2[j].y);
				if( (pnt1[i].x+pnt2[j].x)<2.0*cc.x ) break;
				if( /*Notcc(pnt1[i])==true&&*/NotOnePoint(pnt1[i],pnt2[j])==true&&OK(pnt1[i],pnt2[j])==true ){
					find = true;
					cnt += 2;
					break;
				}
			}
			//if( find==true ) printf("true\n");
			//else printf("false\n");
			if( find==false ) break;
		}
		if( cnt==n ){
			puts("yes");
			continue;
		}
		puts("no");
	}
	return 0;
}


分享到:
评论

相关推荐

    北大POJ初级-计算几何学

    【北大POJ初级-计算几何学】是北京大学编程在线判题平台(Problem Online Judge, POJ)上的一系列初级算法题目,主要涉及计算几何领域的知识。这个领域在计算机科学中占有重要地位,因为它在图形处理、游戏开发、...

    POJ算法题目分类

    * 型如下表的简单 DP:型如下表的简单 DP 是指解决问题的简单 DP 算法,如 poj3267、poj1836、poj1260、poj2533。 * 计算几何学:计算几何学是指解决问题的计算几何学算法,如 poj2031、poj1039。 六、数学 数学...

    POJ题目简单分类(ACM)

    【标题】"POJ题目简单分类(ACM)" 涉及的知识点: 【描述】中的"学习起来更系统,更清爽"暗示了本话题旨在为ACM竞赛初学者提供一个有条理的学习路径。 【标签】"POJ 分类"表明我们将探讨的是基于POJ(Problemset On...

    poj题目分类

    * 简单搜索技巧和剪枝:例如 poj2531、poj1416、poj2676、poj1129。 5. 动态规划: * 背包问题:例如 poj1837、poj1276。 * 类型 DP:例如 poj3267、poj1836、poj1260、poj2533。 中级 1. 基本算法: * C++的...

    poj各种分类

    标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...

    ACM常用算法及其相应的练习题.docx

    * 简单搜索技巧和剪枝:poj2531, poj1416, poj2676, poj1129 五、动态规划 * 背包问题:poj1837, poj1276 * 类似表的简单 DP:poj3267, poj1836, poj1260, poj2533 * 最长公共子序列:poj3176, poj1080, poj1159 *...

    北京大学poj题目类型分类

    计算几何是POJ题目中的一种重要题型,通常涉及计算几何算法的应用,如计算点的位置、计算多边形的面积等。这些题目要求学习者具备计算几何算法的基础知识。 * 1055 I Think I Need a Houseboat:这是一个计算几何...

    poj题目代码

    8. poj_2021.c - "Fence":这道题目可能与几何和动态规划有关,要求在一定的条件下找到最佳围栏布局。 9. poj_1182.c - "Prime String":涉及素数判断和字符串处理,是基础数学与字符串算法的结合。 10. poj_1744....

    强大的POJ分类——各类编程简单题及其算法分类

    【强大的POJ分类——各类编程简单题及其算法分类】 POJ,全称为Peking University Online Judge,是北京大学提供的一个在线编程题目平台,支持多种编程语言,包括Pascal、C、C++、Java、Fortran、Python等。这个...

    百练POJ 题目分类

    - 枚举是一种简单但效率较低的算法策略,通过穷举所有可能的情况来解决问题。 - 适用于解空间较小的情况。 9. **递推** - 递推关系定义了一个序列中每一项与前几项的关系。 - 递推关系可以用来解决许多计数问题...

    POJ题目分类

    - **内容**: 把复杂的问题分解为简单的小问题,通过保存已解决的子问题的答案来避免重复计算。 - **示例题目**: poj1068, poj2632, poj1573, poj2993, poj2996 - **知识点**: - **状态定义**:确定动态规划的状态,...

    acm计算几何与数论

    ##### (3) 多边形的简单算法及相关判定 - **多边形面积**:常用的算法包括鞋带公式等。 - **点在多边形内**:通过射线法或角度法判断点是否位于多边形内部。 - **多边形相交**:通过判断两条边是否相交来确定两个...

    北大POJ初级-数学

    9. **几何基础**:二维几何中的点、线、圆的问题,以及简单的三维几何问题,如点线面的位置关系,距离计算等。 10. **模拟法**:当无法找到直接的数学公式或算法时,可以通过编写程序模拟实际过程来解决问题,如...

    西工大POJ100题(全新)

    例如,在其他题目中,可能会涉及到复杂的数学计算,如计算几何图形的周长与面积、体积等,或者进行更高级的数学运算,比如阶乘、素数计算、最大公约数和最小公倍数的求解等。 除了基本的编程技能,该题目集中还涉及...

    西工大poj2014

    在本压缩包“西工大poj2014”中,包含了一系列的编程作业,主要涉及了2014年POJ(Program Online Judge)平台上的问题。这些题目是针对计算机科学和信息技术领域的学生设计的,旨在提高他们的算法设计和编程能力。...

    ACM常用算法及其相应的练习题 (2).docx

    (2) 简单DP:poj3267, poj1836, poj1260, poj2533 (3) 其他DP问题: 六、中级算法 本部分涵盖了中级算法,包括C++的标准模版库的应用、较为复杂的模拟题的训练、差分约束系统的建立和求解、最小费用最大流、双连通...

    ACM 详解算法目录

    例如,POJ2031和POJ1039是几何公式的经典例题,而POJ1408和POJ1584则是多边型的简单算法的代表题。 中级部分涵盖了基本算法、图算法和其它高级算法。例如,POJ3096和POJ3007是C++标准模版库的应用,而POJ3393和POJ...

    pojacm题目具体分类

    ### poj题目具体分类知识点 **一、主流算法** 1. **搜索** - 回溯:这是一种通过尝试解决子问题并回退来寻找问题解的方法。例如,在解决N皇后问题时,我们会尝试放置皇后,一旦发现冲突就撤销该决策。 2. **动态...

    简单的计算几何课件PPT例子

    计算几何是计算机科学中的一个重要分支,它涉及到二维和三维空间中的几何对象的数学运算和算法。这个领域在图形学、游戏开发、地理信息系统等领域有着广泛的应用。以下将详细阐述一些计算几何的基础概念和常见问题。...

    POJ题目分类-题库分类

    POJ(Problemset Online Judge)是一个在线编程竞赛平台,提供了大量的编程题目供参赛者练习和比赛。这个平台上的题目按照不同的主题和难度进行了分类,帮助参赛者有针对性地提高编程技能和算法理解。以下是一些主要...

Global site tag (gtag.js) - Google Analytics