65 pts 求调
查看原帖
65 pts 求调
857390
vorDeal楼主2024/10/3 12:37
#include <bits/stdc++.h>
using namespace std;

const int maxn = 3e3 + 5;
const long long inf = 1e10 + 7;
int n, k, st, p, q;
double x[maxn], y[maxn], f[maxn][maxn][2];
vector<int> seq;

double dis(int a, int b)
{
    return sqrt((x[a] - x[b]) * (x[a] - x[b]) +
                (y[a] - y[b]) * (y[a] - y[b]));
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> x[i] >> y[i];
        x[i + n] = x[i], y[i + n] = y[i];
        if (y[i] > y[k])
            k = i;
    }
    for (int i = 0; i <= 2 * n; i++)
        for (int j = i; j <= 2 * n; j++)
            f[i][j][0] = f[i][j][1] = inf;
    f[k][k][0] = f[k][k][1] = 0;
    f[k + n][k + n][0] = f[k + n][k + n][1] = 0;
    for (int len = 1; len <= n; len++)
        for (int i = 0; i + len < n * 2; i++)
        {
            int j = i + len;
            f[i][j][0] = min(f[i][j][0], f[i + 1][j][1] + dis(i, j));
            f[i][j][0] = min(f[i][j][0], f[i + 1][j][0] + dis(i, i + 1));
            f[i][j][1] = min(f[i][j][1], f[i][j - 1][0] + dis(i, j));
            f[i][j][1] = min(f[i][j][1], f[i][j - 1][1] + dis(j - 1, j));
        }
    for (int i = 0; i < n; i++)
        for (int j = 0; j < 2; j++)
            if (f[i][i + n - 1][j] < f[p][p + n - 1][st])
                p = i, st = j;
    q = p + n - 1;
    for (int r = 0; r < n; r++)
    {
        if (st == 0)
        {
            st = (f[p + 1][q][0] + dis(p, p + 1) >
                  f[p + 1][q][1] + dis(q, p));
            seq.push_back(p % n + 1), p++;
        }
        else
        {
            st = (f[p][q - 1][0] + dis(p, q) >
                  f[p][q - 1][1] + dis(q - 1, p));
            seq.push_back(q % n + 1), q--;
        }
    }
    for (int i = seq.size() - 1; i >= 0; i--)
        cout << seq[i] << ' ';
    return 0;
}

WA on #5、#8、#9、#17~#20。

应该是小问题。

2024/10/3 12:37
加载中...