Cod sursa(job #808622)

Utilizator mipsPavel Mircea mips Data 6 noiembrie 2012 23:47:30
Problema Inundatii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("inundatii.in");
ofstream fout("inundatii.out");
long long minim;
long long total=0;
int main()
{
    int n,x,y,z;
    fin >> n;
    int coord[3][50001];
    long long distleft[50001];
    long long distright[50001];

    for (int i=0;i<n;i++)
    {
        fin >> x>> y >> z;
        coord[0][n-i-1]=x;
        coord[1][n-i-1]=y;
        coord[2][n-i-1]=z;
    }


    for (int k=0;k<3;k++)
    {
        //cout << "k="<<k<<endl;
        distleft[0] = 0;
        for (int i=1;i<n;i++)
        {
            distleft[i] = distleft[i-1]+ i*(coord[k][i] - coord[k][i-1]);
        }

        distright[n-1] = 0;
        for (int i=n-2;i>=0;i--)
        {
            //cout << "coord" << (coord[i])<<endl;
            distright[i] = distright[i+1]+ ((n-2)-i+1)*(coord[k][i+1] - coord[k][i]);
        }

        minim = distleft[0]+distright[0]+ ((n-1)*(n)/2);
        //cout << "distleft "<<distright[0] <<endl;
        //cout << "i="<<i<<endl;
        //cout << "left"<<distleft[i]<<" right"<<distright[i]<< " surplus"<< ((i)*(i+1)/2) +((n-i)*(n-i-1)/2)<<endl;
        for (int i=1;i<n;i++)
        {
            minim = min(distleft[i]+distright[i]+ ((i)*(i+1)/2) + ((n-i)*(n-i-1)/2) , minim );
            //cout << "i="<<i<<endl;
            //cout << "left"<<distleft[i]<<" right"<<distright[i]<< " surplus"<< ((i)*(i+1)/2) +((n-i)*(n-i-1)/2)<<endl;
        }

        //cout << "bag "<<minim <<endl;
        total += minim;
    }

    fout << total;
}