10pts求助(代码厌氧且只过特殊性质B)
查看原帖
10pts求助(代码厌氧且只过特殊性质B)
529247
BLX32M_10楼主2024/8/7 16:31

悬关。

好像除了最高的点正常输出编号外全都输出 0?

#include <bits/stdc++.h>
//#define cal(x) (((x) - 1) % n + 1)
#define int long long
using namespace std;
double x[2005], y[2005], f[2005][2005][2];
int ll[2005][2005][2], lr[2005][2005][2], li[2005][2005][2];
inline 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 n;
inline int cal(int x)
{
	return (x - 1) % n + 1;
}
signed main()
{
    int mx = 0;
    scanf("%lld", &n);
    y[0] = -1e9;
    for (int i = 1; i <= n; i++)
    {
        scanf("%lf %lf", &x[i], &y[i]);
        x[i + n] = x[i], y[i + n] = y[i];
        if (y[i] > y[mx])
            mx = i;
    }
    for (int i = 1; i <= n * 2; i++)
        for (int j = 1; j <= n * 2; j++)
            f[i][j][0] = f[i][j][1] = 1e9;
    f[mx][mx][0] = f[mx][mx][1] = f[mx + n][mx + n][0] = f[mx + n][mx + n][1] = 0;
    double x, y;
    for (int l = 2; l <= n; l++)
    {
        for (int i = 1, j = l; j <= n * 2; j++)
        {
            x = f[i + 1][j][0] + dis(i, i + 1), y = f[i + 1][j][1] + dis(i, j);
            if (x < y)
                f[i][j][0] = x, ll[i][j][0] = i + 1, lr[i][j][0] = j, li[i][j][0] = 0;
            else
                f[i][j][0] = y, ll[i][j][0] = i + 1, lr[i][j][0] = j, li[i][j][0] = 1;
            x = f[i][j - 1][0] + dis(i, j), y = f[i][j - 1][1] + dis(j - 1, j);
            if (x < y)
                f[i][j][1] = x, ll[i][j][1] = i, lr[i][j][1] = j - 1, li[i][j][1] = 0;
            else
                f[i][j][1] = y, ll[i][j][1] = i, lr[i][j][1] = j - 1, li[i][j][1] = 1;
        }
    }
    int ii, jj, ans = 1e9;
    bool l = 0;
    for (int i = 1; i <= n + 1; i++)
    {
        for (int j = 0; j <= 1; j++)
        {
            if (ans > f[i][i + n - 1][j])
            {
                ans = f[i][i + n - 1][j];
                ii = i, jj = i + n - 1, l = j;
            }
        }
    }
    stack <int> st;
    if (l)
        st.push(cal(jj));
    else
        st.push(cal(ii));
    for (int i = 1; i <= n - 2; i++)
    {
        int ni = ll[ii][jj][l], nj = lr[ii][jj][l], nl = li[ii][jj][l];
        ii = ni, jj = nj, l = nl;
        if (l)
        	st.push(cal(jj));
        else
        	st.push(cal(ii));
    }
    printf("%lld ", mx);
    while (!st.empty())
    {
        printf("%lld ", st.top());
        st.pop();
    }
    return 0;
}
2024/8/7 16:31
加载中...