codeforces 1478 F. Nezzar and Nice Beatmap

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

猜你喜欢

转载自blog.csdn.net/qq_39602052/article/details/113658549