Pagini recente » Cod sursa (job #586575) | Cod sursa (job #690775) | Cod sursa (job #1189982) | Cod sursa (job #706567) | Cod sursa (job #1475064)
#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;
}