Run Time: 0.000
Ranking (as of 2016-07-01): 8 out of 442
Language: C++
/*
UVa 10874 - Segments
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10874_Segments.cpp
*/
#include <algorithm>
#include <cstdio>
using namespace std;
const int n_max = 20000;
enum {left, right};
int segments[n_max][right - left + 1];
// segments[i][left/right] is the left/right side of the i-th segments
int paths[n_max][right - left + 1];
// paths[i][left/right] is the shortest path from (1, 1)
// to the left/right side of the i-th segments
int main()
{
while (true) {
int n;
scanf("%d", &n);
if (!n)
break;
for (int i = 0; i < n; i++)
scanf("%d %d", &segments[i][left], &segments[i][right]);
paths[0][left] = n + segments[0][right] - segments[0][left] - 1,
paths[0][right] = segments[0][right] - 1;
#ifdef DEBUG
printf("[0][%d]: %d\t[0][%d]: %d\n", left, paths[0][left], right, paths[0][right]);
#endif
for (int i = 1; i < n; i++) {
int sd = segments[i][right] - segments[i][left];
int ld, rd;
if (segments[i - 1][left] < segments[i][right])
ld = segments[i][right] - segments[i - 1][left];
else
ld = segments[i - 1][left] - segments[i][right];
if (segments[i - 1][right] < segments[i][right])
rd = segments[i][right] - segments[i - 1][right];
else
rd = segments[i - 1][right] - segments[i][right];
paths[i][left] = min(paths[i - 1][left] + ld + sd, paths[i - 1][right] + rd + sd) + 1;
if (segments[i - 1][left] < segments[i][left])
ld = segments[i][left] - segments[i - 1][left];
else
ld = segments[i - 1][left] - segments[i][left];
if (segments[i - 1][right] < segments[i][left])
rd = segments[i][left] - segments[i - 1][right];
else
rd = segments[i - 1][right] - segments[i][left];
paths[i][right] = min(paths[i - 1][left] + ld + sd, paths[i - 1][right] + rd + sd) + 1;
#ifdef DEBUG
printf("[%d][%d]: %d\t[%d][%d]: %d\n",
i, left, paths[i][left], i, right, paths[i][right]);
#endif
}
printf("%d\n",
min(paths[n - 1][left] + n - segments[n - 1][left],
paths[n - 1][right] + n - segments[n - 1][right]));
}
return 0;
}
No comments:
Post a Comment