悬赏一机房的关注!10pts求调!
查看原帖
悬赏一机房的关注!10pts求调!
490978
小超手123楼主2023/11/13 20:14
#include<bits/stdc++.h>
#define int long long
#define N 1010
using namespace std;
int n;
struct node{
	double x, y;
	int id;
}a[N];
double f[N][N][2];
struct lcc{
	int L, R, o;
}pre[N][N][2];
double d(int aa, int bb) {
	return (a[aa].x - a[bb].x) * (a[aa].x - a[bb].x) + (a[aa].y - a[bb].y) * (a[aa].y - a[bb].y);
}
void upd(double &x, double y, int L, int R, int now, int l, int r, int lst) {
	if(x > y) {
		x = y;
		pre[L][R][now] = (lcc){l, r, lst};
	} 
}
bool cmp(node a, node b) {
	if(a.x != b.x) return a.x < b.x;
	else return a.y < b.y;
}
void dfs(int L, int R, int o) {
	if(L == R) {
		cout << a[L].id << " ";
		return;
	}
	//cout << endl <<"e"<< L << " " << R << endl;
	int l = pre[L][R][o].L, r = pre[L][R][o].R, O = pre[L][R][o].o;
	if(L < l) {
		
		dfs(l, r, O);
		cout << a[L].id << " ";
	}
	else {
		
		dfs(l, r, O);
		cout << a[R].id << " ";
	}
}
signed main() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
    	cin >> a[i].x >> a[i].y;
    	a[i].id = i;
	} 
    sort(a + 1, a + n + 1, cmp);
	int s = 0;
	double Max = -1e18;
	for(int i = 1; i <= n; i++) {
		if(a[i].y > Max) {
			Max = a[i].y;
			s = i;
	    }
	}
	for(int i = 0; i <= n + 1; i++)
	for(int j = i; j <= n + 1; j++) f[i][j][0] = f[i][j][1] = 1e18;
	f[s][s][0] = f[s][s][1] = 0;
	for(int len = 1; len <= n; len++) {
		for(int i = 1; i + len - 1 <= n; i++) {
			int j = i + len - 1;
			upd(f[i - 1][j][0], f[i][j][0] + d(i - 1, i), i - 1, j, 0, i, j, 0);
			upd(f[i - 1][j][0], f[i][j][1] + d(i - 1, j), i - 1, j, 0, i, j, 1);
			upd(f[i][j + 1][1], f[i][j][0] + d(i, j + 1), i, j + 1, 1, i, j, 0);
			upd(f[i][j + 1][1], f[i][j][1] + d(j, j + 1), i, j + 1, 1, i, j, 1);
		}
	}
	if(f[1][n][0] < f[1][n][1]) dfs(1, n, 0);
	else dfs(1, n, 1);
	return 0;
}







2023/11/13 20:14
加载中...