zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    浅谈java中异常处理
    Android四大组件之BroadcastReceiver
    android基本组件 Button
    Android基本组件TextView和EditView
    Unicode,GBK和UTF8
    记一次生产上的紧急修复之后解疑过程
    使用第三方jar时出现的问题
    码农歌单
    创建servlet程序知识点详解---servlet-day12
    创建servlet程序知识点详解---servlet-day07
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10349092.html
Copyright © 2011-2022 走看看