Cod sursa(job #1475073)

Utilizator hrazvanHarsan Razvan hrazvan Data 23 august 2015 16:17:22
Problema Wanted Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <stdio.h>
#define MAXN 201
#define INF 2000000000
int x[MAXN], y[MAXN], st[MAXN][MAXN], dr[MAXN][MAXN];

inline int modul(int a){
  return a < 0 ? -a : a;
}

inline int max2(int a, int b){
  return a > b ? a : b;
}

inline int min2(int a, int b){
  return a < b ? a : b;
}

void qs(int st, int dr){
  int i = st, j = dr, piv = x[(st + dr) / 2], aux;
  while(i <= j){
    while(x[i] < piv)
      i++;
    while(x[j] > piv)
      j--;
    if(i <= j){
      aux = x[i];  x[i] = x[j];  x[j] = aux;
      aux = y[i];  y[i] = y[j];  y[j] = aux;
      i++;  j--;
    }
  }
  if(st < j)
    qs(st, j);
  if(i < dr)
    qs(i, dr);
}

int main(){
  FILE *in = fopen("wanted.in", "r");
  int n, i, j, l, o, sum;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++)
    fscanf(in, "%d%d", &x[i], &y[i]);
  fclose(in);
  /*if(x[0] > 0 || x[n - 1] < 0)
    n++;*/
  qs(0, n - 1);
  for(i = 1; i < n - 1; i++){
    st[i][i] = y[i - 1] + x[i] - x[i - 1] + y[i];
    dr[i][i] = y[i + 1] + x[i + 1] - x[i] + y[i];
  }
  dr[0][0] = y[1] + x[1] - x[0] + y[0];
  st[n - 1][n - 1] = y[n - 2] + x[n - 1] - x[n - 2] + y[n - 1];
  for(l = 2; l <= n; l++){
    for(i = 0; i + l - 1 < n; i++){
      o = i + l - 1;
      st[i][o] = dr[i][o] = INF;
      for(j = i; j <= o; j++){
        if(j > i && j < o){
          if(i != 0){
            sum = max2(dr[i][j - 1], st[j + 1][o]) + x[j] - x[i - 1] + y[j] + y[i - 1];
            if(st[i][o] > sum)
              st[i][o] = sum;
          }
          if(o != n - 1){
            sum = max2(dr[i][j - 1], st[j + 1][o]) + x[o + 1] - x[j] + y[j] + y[o + 1];
            if(dr[i][o] > sum)
              dr[i][o] = sum;
          }
        }
        else  if(j == i){
          if(i != 0){
            sum = st[i][i] + st[i + 1][o];
            if(st[i][o] > sum)
              st[i][o] = sum;
          }
          if(o != n - 1){
            sum = st[i + 1][o] + x[o + 1] - x[i] + y[i] + y[o + 1];
            if(dr[i][o] > sum)
              dr[i][o] = sum;
          }
        }
        else{
          if(i != 0){
            sum = x[o] - x[i - 1] + y[o] + y[i - 1] + dr[i][o - 1];
            if(st[i][o] > sum)
              st[i][o] = sum;
          }
          if(o != n - 1){
            sum = dr[o][o] + dr[i][o - 1];
            if(dr[i][o] > sum)
              dr[i][o] = sum;
          }
        }
      }
    }
  }
  int rez, a, b;
  if(x[0] == 0)
    rez = st[1][n - 1];
  else  if(x[n - 1] == 0)
    rez = dr[0][n - 2];
  else{
    i = 0;
    while(x[i] < 0)
      i++;
    i--;
    if(i == 0)
      a = -x[i] + y[i] + dr[1][n - 1];
    else
      a = -x[i] + y[i] + max2(dr[0][i - 1], st[i + 1][n - 1]);
    if(i != n - 2)
      b = x[i + 1] + y[i + 1] + max2(dr[0][i], st[i + 2][n - 1]);
    else
      b = x[i + 1] + y[i + 1] + st[0][i];
    rez = min2(a, b);
  }
  FILE *out = fopen("wanted.out", "w");
  fprintf(out, "%d", rez);
  fclose(out);
  return 0;
}