1. 程式人生 > 其它 >codeforces 1478 F. Nezzar and Nice Beatmap

codeforces 1478 F. Nezzar and Nice Beatmap

技術標籤:CF

題意: 二維平面上有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; }