题目链接 codeforces 618 C
题意
给出n个点,取三角形,且三角形内不包含其他点
题解:
先对点坐标进行排序,X 或 Y都可以,意思是在边界取三角形,尽可能不接触其他点,如果构不成三角形,往前递推
构不成三角形 : 三点共线,叉乘等于 0 (x1 * y2 ) - (x2 * y1 ) = 0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
struct node{
ll x, y;
int id;
}a[100050];
bool cmp(node k, node u){ // 对纵坐标进行排序
if(k.y != u.y){
return k.y < u.y;
}
return k.x < u.x;
}
ll judge(node k, node u, node p){ // 判断是否能构成三角形
return ((k.x - u.x) * (p.y - u.y) - (p.x - u.x) * (k.y - u.y));
}
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].x >> a[i].y;
a[i].id = i;
}
sort(a+1, a+1+n, cmp);
for(int i = n; i >= 3; i--){
if(judge(a[i], a[i-1],a[i-2]) != 0){
cout << a[i-2].id << " " << a[i-1].id << " " << a[i].id << endl;
break;
}
}
return 0;
}