Withthe increased use of pesticides, the local streams and rivers have become socontaminated that it has become almost impossible for the aquatic animals tosurvive.
Frog Fred is on the left bank of such a river. Nrocks are arranged in a straight line from the left bank to the right bank. Thedistance between the left and the right bank is D meters. There arerocks of two sizes. The bigger ones can withstand any weight but the smallerones start to drown as soon as any mass is placed on it. Fred has to go to theright bank where he has to collect a gift and return to the left bank where hishome is situated.
He can land on every small rock at most one time,but can use the bigger ones as many times as he likes. He can never touch thepolluted water as it is extremely contaminated.
Can you plan the itinerary so that the maximumdistance of a single leap is minimized?
Input
The first line of input is an integer T(T<100) that indicatesthe number of test cases. Each case starts with a line containing two integers N(0≤N≤100)and D(1≤D≤1000000000). The next line gives the descriptionof the N stones. Eachstone is defined by S-M. Sindicates the type Big(B) or Small(S)and M(0<M<D)determines the distance of that stone from the left bank. The stones will begiven in increasing order of M.
Output
For every case, output the case number followed by the minimized maximumleap.
Sample Input | Output for Sample Input |
3 1 10 B-5 1 10 S-5 2 10 B-3 S-6 | Case 1: 5 Case 2: 10 Case 3: 7 |
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int N = 110;
int memo[N][N];
struct Rock
{
char kind;
int size;
};
Rock rock[N];
int n, d;
bool input();
int solve();
int dp(int i, int j);
int main()
{
#ifndef ONLINE_JUDGE
freopen("d:\\OJ\\uva_in.txt", "r", stdin);
#endif // ONLINE_JUDGE
int t;
scanf("%d", &t);
for (int i = 1; i <= t; i++) {
input();
int ans = solve();
printf("Case %d: %d\n", i, ans);
}
return 0;
}
bool input()
{
scanf("%d", &n);
rock[0].kind = 'B', rock[0].size = 0;
rock[n + 1].kind = 'B';
scanf("%d", &rock[n + 1].size);
for (int i = 1; i <= n; i++) {
scanf(" %c-%d", &rock[i].kind, &rock[i].size);
}
return true;
}
int solve()
{
memset(memo, 0xff, sizeof(memo));
return dp(0, 0);
}
int dp(int i, int j)
{
int &res = memo[i][j];
if (res != -1) return res;
res = 1 << 30;
if (i > n && j > n) return res = 0;
if (i <= j) {
for (int t = i; t <= n + 1; t++) {
if (t == j && rock[t].kind != 'B') continue;
res = min(res, max(rock[t].size - rock[i].size, dp(t, j)));
}
} else {
for (int t = j; t <= n + 1; t++) {
if (t == i && rock[t].kind != 'B') continue;
res = min(res, max(rock[t].size - rock[j].size, dp(i, t)));
}
}
return res;
}