[CodeForces_618C]Constellation

题目链接

http://codeforces.com/problemset/problem/618/C

题意

给二维平面一些点的坐标,保证不是所有点都在一条直线上,各点不重合,输出三个点的id,满足其他所有的点都在这三个点组成的三角形的(严格的)外部。
满足题意则这样的三角形是一定存在的。
点坐标范围 ( - 10^9 ≤ xi, yi ≤ 10^9) 。

思路

好吧这应该是水题中的水题了...应该再在纸上画画想一想~
原思路:选择id为1,2,3的点,再来后面的点若在三角形内部(则替换原任意点),特别的,若在三角形某条边上,则替换特定的点。
但对判断点在三角形内部的公式望而却步。

正确思路:
把所有点,按从从左到右,从下到上排序。
只要排序的前三个点构成了三角形,就输出,这样的三角形一定满足题目条件。

注意x1y2-x2y1那里int会爆精度。

代码

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

struct Point {
    int id;
    int x;
    int y;
} point[int(1e5+5)];

bool cmp(struct Point point1,struct Point point2){
    if(point1.x!=point2.x){return point1.x<point2.x;}
    else {return point1.y<point2.y;}
}

int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&point[i].x,&point[i].y);
        point[i].id=i;
    }
    sort(point+1,point+n+1,cmp);
    
    printf("%d %d ",point[1].id,point[2].id);
    for(int i=3;i<=n;i++){
        long long int x1=point[1].x-point[2].x;
        long long int y1=point[1].y-point[2].y;
        long long int x2=point[i].x-point[1].x;
        long long int y2=point[i].y-point[1].y;
        if((x1*y2-x2*y1)!=0){
            printf("%d",point[i].id);
            return 0;
        }
    }
    
    return 0;
}

posted on 2019-02-02 20:20  coding_gaga  阅读(131)  评论(0编辑  收藏  举报

导航