【HDU6300】2018杭电多校训练赛第一场第三题Triangle Partition 解题报告

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6300

题意:

给出3n个坐标点。没有三个点共线。要构建n个不相交的三角形

输入:

第一行输入T表示测试用例数。每个测试用例的第一行输入n,表示要构建的三角形个数。接着的3n行,每行两个数x和y,用于表示坐标点。

输出:

对每一个测试用例输出n行,每行输出三个数,分别表示构建的这个三角形用到的三个坐标顶点的下标。如果有多种解决方案,输出任何一种即可。

分析:

题目说明,没有三个点共线,因此只要把点进行排序(先按x排序,如x相同,就对y排序),这样子从左到右,从上到下依次取点,就可以构建n个不相交的三角形。

由于要有坐标点的下标,所以当输入的时候,要把输入的点给一个值,用于知道这个点是第几个输入的。所以构建一个结构体,有三个元素,x、y和vis。

排序用快排sort即可。

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

struct Point
{
	int x,y;
	int vis;
}point[3010];

bool cmp(Point a,Point b)
{
	if(a.x == b.x) // 相同就按 y 的降序排,否侧按 x 的升序排 
		return a.y > b.y;
	else
		return a.x < b.x;
}

int main()
{
	//freopen("DATA1003.txt","r",stdin);
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		int pointNum = 3*n;
		for(int i = 1;i <= pointNum;i++)
		{
			scanf("%d %d",&point[i].x,&point[i].y);
			point[i].vis = i;
		}
		
		sort(point+1,point+pointNum+1,cmp);
		
		for(int i = 1;i <= pointNum;i++)
		{
			printf("%d",point[i].vis);
			if(i%3==0)
				printf("\n");
			else
				printf(" ");
		}
	}
	
	return 0;
	
}

猜你喜欢

转载自blog.csdn.net/mikchy/article/details/81192668