题意: 二维平面上有n个点,求一种连线方式使每个点的拐角都为锐角
div2F题头衔劝退,但其实还好,
一个三角形里面最多只有一个角不是锐角,所以可以采用类似冒泡排序的方式对他进行调整
刚开始用两边平方和进行比较然后爆longlong了
后来改的向量
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5010;
#define x first
#define y second
pair<ll, ll> mp[N];
vector<ll> ans;
pair<ll, ll> operator-(pair<ll, ll> a, pair<ll, ll>b) {
return pair<ll, ll>(a.x - b.x, a.y - b.y);
}
ll Dot(pair<ll, ll> a,pair<ll, ll> b){
return 1ll*a.x*b.x+1ll*a.y*b.y;
}
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; ++ i) {
cin >> mp[i].x >> mp[i].y;
}
for(int i = 1; i <= n; ++ i) {
ans.push_back(i);
for(int j = i - 1; j > 1;-- j) {
if(Dot(mp[ans[j]] - mp[ans[j - 1]], mp[ans[j - 2]] - mp[ans[j - 1]]) <= 0) {
swap(ans[j], ans[j - 1]);
}
}
}
for(int i = 0; i < n; ++i) {
cout << ans[i] << " ";
}
return 0;
}