Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35026 | baka24 | 【S】T4 | C++ | 通过 | 100 | 205 MS | 137632 KB | 1844 | 2024-11-21 17:05:00 |
#include<bits/stdc++.h> using namespace std; #define int long long #define pb push_back int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=260,inf=1000000000000000000; int n,m,ans,us[MAXN]; struct node{ int x,y,z,X,Y,Z,id; }a[MAXN]; int f[MAXN][MAXN][MAXN]; node X[MAXN],Y[MAXN],Z[MAXN]; bool cmpx(node x,node y){return x.x!=y.x?x.x<y.x:x.id<y.id;} bool cmpy(node x,node y){return x.y!=y.y?x.y<y.y:x.id<y.id;} bool cmpz(node x,node y){return x.z!=y.z?x.z<y.z:x.id<y.id;} int dis(node p,int x,int y,int z){ if(p.X>x||p.Y>y||p.Z>z)return 0; x=X[x].x,y=Y[y].y,z=Z[z].z; return max(0ll,x-p.x)+max(0ll,y-p.y)+max(0ll,z-p.z); } void slv(){ n=read(); for(int i=1;i<=n;i++)a[i].x=read(),a[i].y=read(),a[i].z=read(),a[i].id=i; sort(a+1,a+n+1,cmpx); for(int i=1;i<=n;i++)a[i].X=i; sort(a+1,a+n+1,cmpy); for(int i=1;i<=n;i++)a[i].Y=i; sort(a+1,a+n+1,cmpz); for(int i=1;i<=n;i++)a[i].Z=i; sort(a+1,a+n+1,cmpx); for(int i=1;i<=n;i++)X[i]=a[i]; sort(a+1,a+n+1,cmpy); for(int i=1;i<=n;i++)Y[i]=a[i]; sort(a+1,a+n+1,cmpz); for(int i=1;i<=n;i++)Z[i]=a[i]; memset(f,0x3f,sizeof(f)); f[0][0][0]=0; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ for(int k=0;k<=n;k++){ if(i<n)f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+dis(X[i+1],i+1,j,k)); if(j<n)f[i][j+1][k]=min(f[i][j+1][k],f[i][j][k]+dis(Y[j+1],i,j+1,k)); if(k<n)f[i][j][k+1]=min(f[i][j][k+1],f[i][j][k]+dis(Z[k+1],i,j,k+1)); // cout<<i<<" "<<j<<" "<<k<<" "<<f[i][j][k]<<endl; } } } printf("%lld",f[n][n][n]); } signed main(){ slv(); return 0; }