Pagini recente » Cod sursa (job #2711747) | Cod sursa (job #1528352) | Cod sursa (job #1556821) | Cod sursa (job #227529) | Cod sursa (job #1475136)
#include <stdio.h>
#define MAXN 201
#define INF 2000000000
long long x[MAXN], y[MAXN], st[MAXN][MAXN], dr[MAXN][MAXN];
inline long long modul(long long a){
return a < 0 ? -a : a;
}
inline long long max2(long long a, long long b){
return a > b ? a : b;
}
inline long long min2(long long a, long long b){
return a < b ? a : b;
}
void qs(long long st, long long dr){
long long 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");
long long n, i, j, l, o, sum;
fscanf(in, "%lld", &n);
for(i = 0; i < n; i++)
fscanf(in, "%lld%lld", &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;
}
}
}
}
}
long long rez, a;
if(x[0] == 0)
rez = st[1][n - 1];
else if(x[n - 1] == 0)
rez = dr[0][n - 2];
else{
rez = INF;
i = 0;
while(i < n){
a = modul(x[i]) + y[i];
if(i == 0)
a += st[1][n - 1];
else if(i == n - 1)
a += dr[0][n - 2];
else{
a += max2(dr[0][i - 1], st[i + 1][n - 1]);
}
rez = min2(rez, a);
i++;
}
}
FILE *out = fopen("wanted.out", "w");
fprintf(out, "%lld", rez);
fclose(out);
return 0;
}