码迷,mamicode.com
首页 > 其他好文 > 详细

[CodeForces_618C]Constellation

时间:2019-02-02 20:39:51      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:std   print   http   code   题意   []   problems   .com   set   

题目链接

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

标签:std   print   http   code   题意   []   problems   .com   set   

原文地址:https://www.cnblogs.com/coding-gaga/p/10349092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!