关于春测T3
  • 板块学术版
  • 楼主Guoyh
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/3/6 07:32
  • 上次更新2023/10/23 22:53:40
查看原帖
关于春测T3
88449
Guoyh楼主2023/3/6 07:32

求助,infoj过了,洛谷上WA on2,是因为没有spj吗

# include <bits/stdc++.h>
using namespace std;
typedef pair<long double, long double> pdd;
# define fi first
# define se second
const int MAXN = 1005;
int n, mx;
pdd a[MAXN], b[MAXN];
long double fl[MAXN][MAXN], fr[MAXN][MAXN];
bool pl[MAXN][MAXN], pr[MAXN][MAXN];
long double ds(int u, int v){
	return sqrt((b[u].fi - b[v].fi) * (b[u].fi - b[v].fi) + (b[u].se - b[v].se) * (b[u].se - b[v].se));
}
void prtl(int l, int r);
void prtr(int l, int r);
void prtl(int l, int r){
	cout << (l + mx - 1 - 1) % n + 1 << ' ';
	if (l == r) return;
	if (pl[l][r]) prtl(l + 1, r);
	else prtr(l + 1, r);
}
void prtr(int l, int r){
	cout << (r + mx - 1 - 1) % n + 1 << ' ';
	if (l == r) return;
	if (pr[l][r]) prtl(l, r - 1);
	else prtr(l, r - 1);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cerr << fixed << setprecision(11);
	cout << fixed << setprecision(11);
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i].fi >> a[i].se;
	mx = 1;
	for (int i = 1; i <= n; i++){
		if (a[i].se > a[mx].se + 1e-10) mx = i;
	}
	int bsz = 0;
	b[++bsz] = a[mx];
	for (int i = mx + 1; i != mx; i = i % n + 1) b[++bsz] = a[i];
	// for (int i = 1; i <= bsz; i++) cerr << b[i].fi << ' ' << b[i].se << '\n';
	// cerr << "ds " << ds(1, 2) << '\n';
	for (int l = n; l >= 1; l--){
		fl[l][l] = fr[l][l] = 0;
		for (int r = l + 1; r <= n; r++){
			fl[l][r] = min(fl[l + 1][r] + ds(l, l + 1), fr[l + 1][r] + ds(l, r));
			pl[l][r] = fl[l + 1][r] + ds(l, l + 1) < fr[l + 1][r] + ds(l, r);
			fr[l][r] = min(fl[l][r - 1] + ds(r, l), fr[l][r - 1] + ds(r, r - 1));
			pr[l][r] = fl[l][r - 1] + ds(r, l) < fr[l][r - 1] + ds(r, r - 1);
			// cerr << "f " << l << ' ' << r << ' ' << fl[l][r] << '\n';
		}
	}
	// cerr << "f " << fl[1][n] << '\n';
	prtl(1, n);
	cout << '\n';
	return 0;
}
2023/3/6 07:32
加载中...