社区讨论

救救孩子吧

P9119[春季测试 2023] 圣诞树参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo1t7cdl
此快照首次捕获于
2023/10/23 02:35
2 年前
此快照最后确认于
2023/11/03 03:09
2 年前
查看原帖
CPP
#include<iostream>
#include<cmath>
using namespace std;
int n,k=1;
struct point{
    long double x,y;
}ps[2048];
long double f[2048][2048][2];
long double dis[2048][2048];
int pre[2048][2048][2][3];
inline long double getdis(const point& a,const point& b)
{
    return sqrtl(static_cast<long double>(a.x-b.x)*(a.x-b.x)+static_cast<long double>(a.y-b.y)*(a.y-b.y));
}
void print(int i,int j,int mod)
{
    if(i==j)
    {
        printf("%d",i>n?i-n:i);
        return;
    }
    print(pre[i][j][mod][0],pre[i][j][mod][1],pre[i][j][mod][2]);
    if(mod)
        printf(" %d",j>n?j-n:j);
    else printf(" %d",i>n?i-n:i);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>ps[i].x>>ps[i].y;
        if(ps[i].y>ps[k].y)
            k=i;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dis[i][j]=dis[i+n][j]=dis[i][j+n]=dis[i+n][j+n]=getdis(ps[i],ps[j]);
    for(int i=0;i<=n*2;i++)
        for(int j=0;j<=n*2;j++)
            f[i][j][0]=f[i][j][1]=1e32;
    f[k][k][0]=f[k][k][1]=f[k+n][k+n][0]=f[k+n][k+n][1]=0;
    for(int len=2;len<=n;len++)
        for(int i=1;i+len-1<=n*2;i++)
        {
            int j=i+len-1;
            if(f[i+1][i][0]+dis[i][i+1]>f[i+1][j][1]+dis[i][j])
            {
                f[i][j][0]=f[i+1][j][1]+dis[i][j];
                pre[i][j][0][0]=i+1;
                pre[i][j][0][1]=j;
                pre[i][j][0][2]=1;
            }
            else
            {
                f[i][j][0]=f[i+1][j][0]+dis[i][i+1];
                pre[i][j][0][0]=i+1;
                pre[i][j][0][1]=j;
                pre[i][j][0][2]=0;
            }
            if(f[i][j-1][0]+dis[i][j]>f[i][j-1][1]+dis[j-1][j])
            {
                f[i][j][1]=f[i][j-1][1]+dis[j-1][j];
                pre[i][j][1][0]=i;
                pre[i][j][1][1]=j-1;
                pre[i][j][1][2]=1;
            }
            else
            {
                f[i][j][1]=f[i][j-1][0]+dis[i][j];
                pre[i][j][1][0]=i;
                pre[i][j][1][1]=j-1;
                pre[i][j][1][2]=0;
            }
        }
    int resi=0,resj=0,resmod=0;
    for(int i=1;i<=n;i++)
    {
        if(f[resi][resj][resmod]>f[i][i+n-1][0])
        {
            resi=i;
            resj=i+n-1;
            resmod=0;
        }
        if(f[resi][resj][resmod]>f[i][i+n-1][1])
        {
            resi=i;
            resj=i+n-1;
            resmod=1;
        }
    }
    print(resi,resj,resmod);
    return 0;
}

40pts求调,不知道什么地方错了

回复

1 条回复,欢迎继续交流。

正在加载回复...