社区讨论
改对了是我活爹 95pts WA #15
P9119[春季测试 2023] 圣诞树参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @misy4lwj
- 此快照首次捕获于
- 2025/12/05 22:14 2 个月前
- 此快照最后确认于
- 2025/12/07 17:05 2 个月前
差一点 疑似精度问题
CPP// Problem: P9119 [春季测试 2023] 圣诞树
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P9119
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
const long double INF = 9e18;
struct Node
{
int x,y,id;
}fat[1005][1005][2],st;
int n,cnt1,cnt2,lef[1005],rig[1005],idtop=1e9;
long double x[1005],y[1005],f[1005][1005][2],maxy=-1e18;
long double answ=9e18;
long double disq(int a,int b)
{
return sqrt(1.0*abs(x[a]-x[b])*abs(x[a]-x[b])+1.0*abs(y[a]-y[b])*abs(y[a]-y[b]));
}
void dfs(int xx,int yy,int id)
{
if ((!xx)&&(!yy))
{
cout<<idtop<<' ';
return;
}
dfs(fat[xx][yy][id].x,fat[xx][yy][id].y,fat[xx][yy][id].id);
if (id==0)
{
cout<<lef[xx]<<' ';
}
else
{
cout<<rig[yy]<<' ';
}
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
if (y[i]>maxy||(y[i]==maxy&&x[i]<x[idtop]))
{
maxy=y[i];
idtop=i;
}
}
for (int i=idtop-1;i>=1;i--)
{
cnt1++;
lef[cnt1]=i;
}
for (int i=n;i>=idtop+1;i--)
{
cnt1++;
lef[cnt1]=i;
}
for (int i=idtop+1;i<=n;i++)
{
cnt2++;
rig[cnt2]=i;
}
for (int i=1;i<=idtop-1;i++)
{
cnt2++;
rig[cnt2]=i;
}
lef[0]=idtop,rig[0]=idtop;
for (int i=0;i<=1000;i++){for (int j=0;j<=1000;j++) f[i][j][0]=f[i][j][1]=1e9;}
f[0][0][0]=f[0][0][1]=0;
for (int i=1;i<=n-1;i++)
{
for (int j=0;j<=i;j++)
{
int leff=j,rigg=i-j;
if (leff>=1)
{
long double tmp1=f[leff-1][rigg][0]+disq(lef[leff-1],lef[leff]);
long double tmp2=f[leff-1][rigg][1]+disq(rig[rigg],lef[leff]);
if (tmp1<=tmp2)
{
fat[leff][rigg][0]={leff-1,rigg,0};
}
else
{
fat[leff][rigg][0]={leff-1,rigg,1};
}
f[leff][rigg][0]=min(tmp1,tmp2);
}
if (rigg>=1)
{
long double tmp1=f[leff][rigg-1][1]+disq(rig[rigg-1],rig[rigg]);
long double tmp2=f[leff][rigg-1][0]+disq(lef[leff],rig[rigg]);
if (tmp1<=tmp2)
{
fat[leff][rigg][1]={leff,rigg-1,1};
}
else
{
fat[leff][rigg][1]={leff,rigg-1,0};
}
f[leff][rigg][1]=min(tmp1,tmp2);
}
}
}
for (int i=0;i<=n-1;i++)
{
int gett1=i,gett2=n-i-1;
if (answ>f[gett1][gett2][0])
{
answ=f[gett1][gett2][0];
st={gett1,gett2,0};
}
if (answ>f[gett1][gett2][1])
{
answ=f[gett1][gett2][1];
st={gett1,gett2,1};
}
}
dfs(st.x,st.y,st.id);
return 0;
}
改对了你就是我活爹,大大的感谢你
回复
共 2 条回复,欢迎继续交流。
正在加载回复...