社区讨论
90分求助,WA#15#16
P9119[春季测试 2023] 圣诞树参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m0hvkk7n
- 此快照首次捕获于
- 2024/08/31 16:22 2 年前
- 此快照最后确认于
- 2025/11/04 21:56 4 个月前
RT,错误原因为输出0
CPP#include<bits/stdc++.h>
using namespace std;
long double dp[2010][2010][2];
long double x[2010], y[2010];
int n, k, pre[2010][2010][2];
long double d(int i, int j) {
return sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2));
}
void write(int l, int r, int k) {
if (l == 0 || r == 0) {
cout << k << " ";
return;
}
if (l >= r) {
cout << (l - n <= 0 ? l : l - n) << " ";
return;
} else if (k) {
write(l, r - 1, pre[l][r][k]);
cout << (r - n <= 0 ? r : r - n) << " ";
} else {
write(l + 1, r, pre[l][r][k]);
cout << (l - n <= 0 ? l : l - n) << " ";
}
}
signed main() {
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)cin >> x[i] >> y[i];
for (int i = 1; i <= n; i++) {
if (y[i] > y[k])k = i;
x[i + n] = x[i];
y[i + n] = y[i];
}
for (int i = 0; i <= 2 * n; i++) {
for (int j = 0; j <= 2 * n; j++) {
dp[i][j][0] = dp[i][j][1] = 1e9;
}
}
dp[k][k][0] = dp[k][k][1] = 0;
dp[k + n][k + n][0] = dp[k + n][k + n][1] = 0;
for (int l = 2; l <= n; l++) {
for (int i = 1; i + l - 1 <= 2 * n; i++) {
int j = i + l - 1;
if (j < k || i > k)continue;
dp[i][j][1] = min(dp[i][j][1], min(dp[i][j - 1][1] + d(j - 1, j), dp[i][j - 1][0] + d(i, j)));
if (dp[i][j][1] == dp[i][j - 1][1] + d(j - 1, j))pre[i][j][1] = 1;
else pre[i][j][1] = 0;
dp[i][j][0] = min(dp[i][j][0], min(dp[i + 1][j][1] + d(j, i), dp[i + 1][j][0] + d(i + 1, i)));
if (dp[i][j][0] == dp[i + 1][j][1] + d(j, i))pre[i][j][0] = 1;
else pre[i][j][0] = 0;
}
}
int l = 0, r = 0, k = 0;
for (int i = 1; i <= n; i++) {
int j = i + n - 1;
if (dp[i][j][0] < dp[l][r][k]) {
l = i;
r = j;
k = 0;
}
if (dp[i][j][1] < dp[l][r][k]) {
l = i;
r = j;
k = 1;
}
}
//cout<<dp[l][r][k]<<"\n";
write(l, r, k);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...