HDU 6300 Triangle Partition ---(计算几何)2018 Multi-University Training Contest 1

其实这道题也算不上计算几何,但是标准题解上是用凸包写的。我是瞎贪心做的。本身可以一遍过的,但是因为自己zz,输出写错,然后wa了一发。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6300

题意。给你3*n个点,问输出n个不相交的三角形的三个顶点编号。保证三点不共线。

题解。我们把所有点按照y从小到大,x从小到达排个序,然后依次输出就ok了,为什么这么做是对的呢?

我们不妨画个图。因为任意三点不共线,所以对于任意一个 直线 y = n(n是有理数)都最多只有两个顶点。那么我们从下向上依次选,就不会有相交。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+5;
struct Point{
    int x;
    int y;
    int id;
}p[maxn];
bool cmp(Point a,Point b){
    if(a.y == b.y)
     return a.x < b.x;    
    else return a.y < b.y;
}

int main(){
    int z;
    cin >> z;
    while(z--){
        int n;
        cin >> n;
        for(int i = 1 ; i <= 3 * n  ; i ++){
            cin >> p[i].x;
            cin >> p[i].y;
            p[i].id = i;
        }
//        for(int i = 1 ; i <= 3 * n ; i ++ ){
//            cout << p[i].id << endl;
//        }
        sort(p+1,p+1+(3*n),cmp);
        
        for(int i = 1 ; i <= 3*n ; i += 3 ){
            cout << p[i].id << " " << p[i+1].id << " " << p[i+2].id << endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/pk__pk/article/details/81183688