题目链接
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;
}