Pagini recente » Cod sursa (job #40951) | Cod sursa (job #529837) | Cod sursa (job #498428) | Cod sursa (job #885314) | Cod sursa (job #163603)
Cod sursa(job #163603)
#include <stdio.h>
#include <algorithm>
using namespace std;
const int n_max = 256;
const int INF = (1<<30);
pair <int , int > v[n_max];
int d[n_max][n_max][2];
int i, n, j, k, sol;
inline int maxim(int x, int y)
{
if (x > y)
return x;
return y;
}
inline int minim(int x, int y)
{
if (x < y)
return x;
return y;
}
inline int ABS(int x)
{
if (x < 0)
return -x;
return x;
}
int main()
{
freopen("wanted.in","r",stdin);
freopen("wanted.out","w",stdout);
sol = INF;
scanf("%d", &n);
for (i = 1; i <= n; ++ i)
scanf("%d %d", &v[i].first, &v[i].second);
sort(v+1, v+n+1);
for (i = 1; i <= n; ++ i)
for (j = 1; i+j <= n; ++ j)
{
d[i][i+j][0] = INF;
d[i][i+j][1] = INF;
}
for (i = 1; i <= n; ++i)
{
d[i][i][0] = v[i].second;
d[i][i][1] = v[i].second;
}
for (i = 1; i <= n; ++ i)
for (j = 1; i+j <= n; ++j)
for (k = i; k <= i+j; ++ k)
{
int val = v[k].first-v[i].first +(v[k].second*2);
int dd= 0, ds = 0;
if ( k -1 >=i)
dd = v[k].first-v[k-1].first;
if ( k+1 <=j+i)
ds = v[k+1].first-v[k].first;
d[i][i+j][0] = minim(d[i][i+j][0], val + maxim(d[i][k-1][1]+ dd,d[k+1][i+j][0]+ds));
val = v[i+j].first - v[k].first +(v[k].second*2);
d[i][i+j][1] = minim(d[i][i+j][1], val + maxim(d[i][k-1][1]+ dd,d[k+1][i+j][0]+ds));
}
for (i = 1; i <= n; ++ i)
{
int val = ABS(v[i].first) + 2*v[i].second;
int dd= 0, ds = 0;
if ( i -1 > 0)
dd = v[i].first-v[i-1].first;
if ( i+1 <=n)
ds = v[i+1].first-v[i].first;
val +=maxim(d[1][i-1][1]+dd, d[i+1][n][0]+ds);
sol = minim(sol, val);
}
printf("%d\n", sol);
return 0;
}