http://acm.hdu.edu.cn/showproblem.php?pid=6300
题意给出T个测试案例,接下来输入整数n,然后输入3*n个顶点,题目保证三点不共线,要求输出构成不相交三角形的所代表的对应的顶点。
刚开始连题目都没看懂,其实这个题目只要把顶点的横坐标排序,每三个点输出,这样构成的三角形当然不会相交,被自己蠢哭。
后来提交的时候其实我还连带着把纵坐标也排序,其实根本没必要,因为题目已经保证三点不共线了,那么即使横纵坐标都相等那也只有两个点而已,再加上另外一个点也能构成三角形。
贴出代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct Node
{
int x, y;
int b;
}dot[3001];
bool cmp(Node a, Node b)
{
return a.x < b.x;
}
int main()
{
int T;
int n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int count = 0;
//有一个小细节要注意,这里输入要以0开始,因为后面的sort排序是以0坐标开始的
for (int i = 0; i < 3*n; i++)
{
scanf("%d%d", &dot[i].x, &dot[i].y);
dot[i].b = i+1;
}
sort(dot, dot+3*n, cmp);
for(int i = 0; i < 3*n; i++)
{
if (count < 2)
{
printf("%d ", dot[i].b);
count++;
}
else {
printf("%d\n", dot[i].b);
count = 0;
}
}
}
return 0;
}