题目链接:点击打开链接
给出n个点的坐标, 输出三个点的序号, 使得其他点都在这三个点组成的三角形的外边.
按照横坐标由小到大进行排序, 横坐标相同的则纵坐标由小到大排序, 从第三个点开始遍历, 如果三点不同线则当前三个点是所求点, 同
事也可以按照纵坐标由小到大排序, 一样的道理.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
#define X first
#define Y second
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 5;
int n, ans;
pair<pair<int, int>, int > a[MAXN];
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d%d", &a[i].X.X, &a[i].X.Y);
a[i].Y = i;
}
sort(a + 1, a + 1 + n);
double k1 = double(a[2].X.X - a[1].X.X) / double(a[2].X.Y - a[1].X.Y);
for(int i = 3; i <= n; ++i) {
double k2 = double(a[i].X.X - a[2].X.X) / double(a[i].X.Y - a[2].X.Y);
if(a[i].X > a[2].X && k1 != k2) {
ans = i;
break;
}
}
printf("%d %d %d\n", a[1].Y, a[2].Y, a[ans].Y);
return 0;
}