Pagini recente » Cod sursa (job #2883410) | Borderou de evaluare (job #1570290) | Borderou de evaluare (job #3157649) | Borderou de evaluare (job #1437112) | Cod sursa (job #164309)
Cod sursa(job #164309)
#include <stdio.h>
#define nmax 205
#define infinit 2000000000
int X[nmax], Y[nmax], Z[nmax], T[nmax];
int N, ans, maxim;
int D[nmax][nmax], S[nmax][nmax], d[nmax][nmax];
void msort(int l, int r)
{
if (l >= r)
return;
int m = (l+r)>>1, i, j, k;
msort(l, m);
msort(m+1, r);
for (i = k = l, j = m+1; i <= m && j <= r; k++)
{
if (X[i] <= X[j])
{
Z[k] = X[i];
T[k] = Y[i];
i++;
}
else
{
Z[k] = X[j];
T[k] = Y[j];
j++;
}
}
for (; i <= m; i++, k++)
{
Z[k] = X[i];
T[k] = Y[i];
}
for (; j <= r; j++, k++)
{
Z[k] = X[j];
T[k] = Y[j];
}
for (k = l; k <= r; ++k)
{
X[k] = Z[k];
Y[k] = T[k];
}
}
void read()
{
int i;
freopen("wanted.in", "r", stdin);
scanf("%d", &N);
for (i = 1; i <= N; ++i)
scanf("%d%d", &X[i], &Y[i]);
}
int max(int l, int r)
{
return l < r? r: l;
}
void solve()
{
int i, l, j, k, x;
// sortez orasele dupa coordonata x
msort(1, N);
// distanta dintre doua orase, parcurse
for (i = 1; i <= N; ++i)
for (j = i+1; j <= N; ++j)
d[i][j] = d[j][i] = Y[i] + Y[j] + (X[i] > X[j]? X[i]-X[j]: X[j]-X[i]);
// dreptele de lungime 1
for (i = 1; i < N; ++i)
D[i][i+1] = d[i][i+1];
for (i = 2; i <= N; ++i)
S[i][i-1] = d[i][i-1];
for (l = 2; l <= N; ++l)
{
// la stanga
for (i = l+1; i <= N; ++i)
{
S[i][i-l] = infinit;
for (k = i-l; k <= i; k++)
{
maxim = 0;
if (k > i-l && S[k][i-l] > maxim)
maxim = S[k][i-l];
if (k < i-1 && D[k][i-1] > maxim)
maxim = D[k][i-1];
if (maxim + d[i][k] < S[i][i-l])
S[i][i-l] = maxim + d[i][k];
}
}
// la dreapta
for (i = 1; i <= N-l; i++)
{
D[i][i+l] = infinit;
for (k = i+1; k <= i+l; k++)
{
maxim = 0;
if (k > i+1 && S[k][i+1] > maxim)
maxim = S[k][i+1];
if (k < i+l && D[k][i+l] > maxim)
maxim = D[k][i+l];
if (maxim + d[i][k] < D[i][i+l])
D[i][i+l] = maxim + d[i][k];
}
}
}
ans = infinit;
for (i = 1; i <= N; ++i)
if ((x = max(S[i][1], D[i][N]) + Y[i] + (X[i] < 0? -X[i]: X[i])) < ans)
ans = x;
}
void write()
{
freopen("wanted.out", "w", stdout);
printf("%d\n", ans);
}
int main()
{
read();
solve();
write();
return 0;
}