Pagini recente » Cod sursa (job #1173712) | Cod sursa (job #1004542) | Cod sursa (job #1150446) | Cod sursa (job #615900) | Cod sursa (job #1413021)
#include <fstream>
#include <algorithm>
#include <climits>
using namespace std;
#define NMAX 207
pair < int , int > a[NMAX];
int h[NMAX],x[NMAX];
int d[NMAX][NMAX][2];
int N,i,c,j,len,k,ans;
int main()
{
ifstream f("wanted.in");
ofstream g("wanted.out");
//d[len][i][0] = costul pentru a investiga i...i+len-1 venind din i-1
//d[len][i][1] = costul pentru a investiga i...i+len-1 venind din i+len
f >> N;
for (i=1;i<=N;++i)
f >> a[i].first >> a[i].second;
sort(a+1,a+N+1);
for (i=1;i<=N;++i)
{
x[i] = a[i].first;
h[i] = a[i].second;
}
for (i=2;i<=N;++i)
d[1][i][0] = (x[i] - x[i-1]) + h[i];
for (i=1;i<=N-1;++i)
d[1][i][1] = (x[i+1] - x[i]) + h[i];
for (len=2;len<=N-1;++len)
for (i=1;i<=N-len+1;++i)
{
j = i + len - 1;
//investighez i...j
//plec din i-1
if (i-1 >= 1)
{
d[len][i][0] = INT_MAX;
for (k=i;k<=j;++k)
{
c = max(d[k-i][i][1] , d[j-k][k+1][0]) + 2*h[k] + x[k] - x[i-1];
d[len][i][0] = min ( d[len][i][0] , c);
}
}
//plec din j+1
if (j+1<=N)
{
d[len][i][1] = INT_MAX;
for (k=i;k<=j;++k)
{
c = max(d[k-i][i][1] , d[j-k][k+1][0]) + 2*h[k] + x[j+1] - x[k];
d[len][i][1] = min(d[len][i][1] , c);
}
}
}
ans = INT_MAX;
for (i=2;i<=N-1;++i)
{
// i este pivotul , adica in el ma duc prima data din 0
c = max(d[i-1][1][1] , d[N-i][i+1][0]) + ((x[i]<0) ? -x[i] : x[i]) + 2*h[i];
ans = min(ans,c);
}
// pivotul este 1
c = d[N-1][2][0] + ((x[1]<0) ? -x[1] : x[1]) + 2*h[1];
ans = min(ans,c);
//pivotul este N
c = d[N-1][1][1] + ((x[N]<0) ? -x[N] : x[N]) + 2*h[N];
ans = min(ans,c);
g << ans << '\n';
return 0;
}