Pagini recente » Cod sursa (job #2418482) | Cod sursa (job #1951232) | Cod sursa (job #2266599) | Cod sursa (job #1746021) | Cod sursa (job #205489)
Cod sursa(job #205489)
using namespace std;
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <utility>
#include <functional>
#define pb psuh_back
#define x first
#define y second
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin()+1 , v.end()
#define C(v) C.erase( all(v) )
#define FORit(it,v) for(it = (v).begin();it != (v).end();++it)
#define mp make_pair
#define N_MAX 1<<9
#define CH 1<<14
#define oo 1<<30
#define IN "wanted.in"
#define OUT "wanted.out"
vector< pair<int,int> > V(N_MAX);
int K(-1),N;
int A[N_MAX][N_MAX],B[N_MAX][N_MAX];
char buffer[CH];
inline int read()
{
int aux(0);
char semn(1);
for(;buffer[K] > '9' || buffer[K] < '0';++K)
semn = (buffer[K] == '-' ? -1 : semn);
for(;buffer[K] <= '9' && buffer[K] >= '0';++K)
aux = aux * 10 + buffer[K] - '0';
return aux*semn;
}
void scan()
{
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
fread(buffer,1,CH,stdin);
N = read();
V.resize(N+1);
FOR(i,1,N)
V[i].x = read(),
V[i].y = read();
sort( all(V) );
}
void solve()
{
int rez(oo),worse;
for(int i=0;++i<=N; A[i][i] = B[i][i] = V[i].y);
FOR(d,1,N)
FOR(i,1,N-d)
{
int j = i + d;
A[i][j] = B[i][j] = oo;
FOR(k,i+1,j-1)
{
worse = max(A[k+1][j] + V[k+1].x - V[k].x , B[i][k-1] + V[k].x - V[k-1].x);
A[i][j] = min(A[i][j], worse + V[k].x - V[i].x + (V[k].y<<1) );
B[i][j] = min(B[i][j], worse + V[j].x - V[k].x + (V[k].y<<1) );
}
//cazul k=i
A[i][j] = min(A[i][j], (V[i].y<<1) + V[i+1].x - V[i].x + A[i+1][j]);
B[i][j] = min(B[i][j], (V[i].y<<1) + V[j].x + V[i+1].x - (V[i].x<<1) + A[i+1][j]);
//cazul k=j
A[i][j] = min(A[i][j], (V[j].y<<1) + (V[j].x<<1) - V[i].x - V[j-1].x + B[i][j-1]);
B[i][j] = min(B[i][j], (V[j].y<<1) + V[j].x - V[j-1].x + B[i][j-1]);
}
FOR(i,2,N-1)
rez = min(rez, abs(V[i].x) + (V[i].y<<1) + max(V[i].x - V[i-1].x + B[1][i-1] , V[i+1].x - V[i].x + A[i+1][N]));
// rez = min(rez,abs(V[1].x) + (V[1].y<<1) + V[2].x - V[1].x + A[2][N]);
// rez = min(rez,abs(V[N].x) + (V[N].y<<1) + V[N].x - V[N - 1].x + B[1][N - 1]);
printf("%d\n",rez);
}
int main()
{
scan();
solve();
return 0;
}