Cod sursa(job #1491322)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 25 septembrie 2015 08:17:09
Problema Inundatii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<cstdio>
struct cord{
    int x;
    int y;
    int z;
}v[50100];
int n,i,j,a,b,s;
FILE *f,*g;
int modul(int a){
    if(a<0)
        return -a;
    return a;
}
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int main(){
    f=fopen("inundatii.in","r");
    g=fopen("inundatii.out","w");
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++){
        fscanf(f,"%d%d%d",&v[i].x,&v[i].y,&v[i].z);
    }
    if(v[n].x<n){
        s+=n-v[n].x-1;
        v[n].x=n-1;
    }
    if(v[n].y<n){
        s+=n-v[n].y-1;
        v[n].y=n-1;
    }
    if(v[n].z<n){
        s+=n-v[n].z-1;
        v[n].z=n-1;
    }
    for(i=n-1;i>=1;i--){
        a=modul(v[i].x-v[i+1].x)+modul(v[i].y-v[i+1].y)+modul(v[i].z-v[i+1].z)+3;
        s+=a;
        if(v[i].x>v[i-1].x && i>1 ){
            b=minim( a, v[i].x-v[i-1].x+1 );
            v[i].x-=b;
            a-=b;
        }
        else if(v[i].x<=v[i-1].x && i>1 ){
            b=minim( a, v[i-1].x-v[i].x+1 );
          //  v[i].x-=b;
          //  a-=b;
        }
        if(v[i].y>v[i-1].y && i>1 ){
            b=minim( a, v[i].y-v[i-1].y+1 );
            v[i].y-=b;
            a-=b;
        }
        else if(v[i].y<=v[i-1].y && i>1 ){
            b=minim( a, v[i-1].y-v[i].y+1 );
          //  v[i].y-=b;
          //  a-=b;
        }
        if(v[i].z>v[i-1].z && i>1 ){
            b=minim( a, v[i].z-v[i-1].z+1 );
            v[i].z-=b;
           a-=b;
        }
        else if(v[i].z<=v[i-1].z && i>1 ){
            b=minim( a, v[i-1].z-v[i].z+1 );
          //  v[i].z-=b;
          //  a-=b;
        }
    }
    fprintf(g,"%d",s);
    fclose(f);
    fclose(g);
    return 0;
}