[CodeForces_618C]Constellation

Posted coding-gaga

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
}






以上是关于[CodeForces_618C]Constellation的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 618C CodeForces 618C

Codeforces Round #618 (Div. 1)C(贪心)

Codeforces Round #618 (Div. 2) C.Anu Has a Function

Codeforces Round #618 (Div. 2)题解

Codeforces Round #618 (Div. 2)

codeforces618B