Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 66 si 65 | Cod sursa (job #1501079) | Cod sursa (job #2151946) | Cod sursa (job #2950180) | Cod sursa (job #125431)
Cod sursa(job #125431)
#include <stdio.h>
long x[50001],y[50001],z[50001],st[50001],dr[50001],min,mini,p;
int n,i,j,k,l,m;
int main()
{
freopen("inundatii.in","r",stdin);
freopen("inundatii.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;++i)
scanf("%ld %ld %ld",&x[i],&y[i],&z[i]);
st[1]=0;
for (i=2;i<=n;++i)
{
st[i]=st[i-1]+x[i-1]-x[i]+y[i-1]-y[i]+z[i-1]-z[i];
}
dr[n]=0;
for (i=n-1;i>=1;--i)
{
dr[i]=dr[i+1]+x[i]-x[i+1]+y[i]-y[i+1]+z[i]-z[i+1];
}
min=2000000000;
for (i=1;i<=n-1;++i)
{
if (x[i]-x[i+1]<=z[i]-z[i+1] && x[i]-x[i+1]<=y[i]-y[i+1]) mini=x[i]-x[i+1];
if (y[i]-y[i+1]<=z[i]-z[i+1] && x[i]-x[i+1]>=y[i]-y[i+1]) mini=y[i]-y[i+1];
if (x[i]-x[i+1]>=z[i]-z[i+1] && z[i]-z[i+1]<=y[i]-y[i+1]) mini=z[i]-z[i+1];
p=st[i]*((i*(i-1)*3)/2)+dr[i]*(((n-i)*(n-i+1)*3)/2);
if (p<min) min=p;
for (j=0;j<=mini;++j)
{if (p+3*j*(2*i-n)<min) min=p+3*j*(2*i-n);}
}
for (i=n;i>1;--i)
{
if ((-x[i]+x[i-1]<=-z[i]+z[i-1]) && (-x[i]+x[i-1]<=-y[i]+y[i-1])) mini=-x[i]+x[i-1];
if ((-y[i]+y[i-1]<=-z[i]+z[i-1]) && (-x[i]+x[i-1]>=-y[i]+y[i-1])) mini=-y[i]+y[i-1];
if ((-x[i]+x[i-1]>=-z[i]+z[i-1]) && (-z[i]+z[i-1]<=-y[i]+y[i-1])) mini=-z[i]+z[i-1];
p=st[i]*((i*(i-1)*3)/2)+dr[i]*(((n-i)*(n-i+1)*3)/2);
if (p<min) min=p;
for (j=0;j<=mini;++j)
{if (p+3*j*(n-2*i)<min) min=p+3*j*(-2*i+n);}
}
printf("%ld",min);
fclose(stdin);
fclose(stdout);
return(0);
}