Cod sursa(job #3232777)

Utilizator elisa.ipateElisa Ipate elisa.ipate Data 1 iunie 2024 12:42:16
Problema Inundatii Scor 20
Compilator cpp-64 Status done
Runda Simulare E4 #1 Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

#define nmax 2001
#define int long long
int x[nmax], y[nmax], z[nmax], n;
int dp[nmax][nmax];
int pozx[nmax],  pozy[nmax], pozz[nmax];

void solve( int v[], int poz[] ) {
    int i, j;
    for( i = 1; i <= n; i++ )
        dp[i][0] = dp[i - 1][0] + abs( v[i] - poz[0] );
    for( i = 0; i <= n; i++ )
        dp[0][i] = 0;
    for( i = 1; i <= n; i++ )
        for( j = 1; j <= n; j++ )
            dp[i][j] = min( dp[i - 1][j] + abs( v[i] - poz[j] ), dp[i][j - 1] );
}

signed main() {
    ifstream cin("inundatii.in" );
    ofstream cout("inundatii.out" );
    int i, rez = 0;
    cin >> n;
    for( i = 1; i <= n; i++ ) {
        cin >> x[i] >> y[i] >> z[i];
        x[i] -= i;
        y[i] -= i;
        z[i] -= i;
        pozx[i] = x[i];
        pozy[i] = y[i];
        pozz[i] = z[i];
    }
    sort( pozx + 1, pozx + n + 1 );
    sort( pozy + 1, pozy + n + 1 );
    sort( pozz + 1, pozz + n + 1 );
    solve( x, pozx );
    rez += dp[n][n];
    solve( y, pozy );
    rez += dp[n][n];
    solve( z, pozz );
    rez += dp[n][n];
    cout << rez;
    return 0;
}