题意:略。
思路:
以为我这个思路是大众思路原来不是。。。百度了一下什么最大流(膜拜熟练应用最大流选手)
二分很显然对吧,然后我就想二分完DP嘛,好像不行,感觉怎么搞都是你已经把答案搞出来的感觉,所以二分显得没有意义,想想贪心吧~
然后突然一想,其实你想啊,走回来和走过去是一样的对吧,无非就是有些不能一起走。那么我们先在起始位置(0)放两个人,然后一起往前走,首先找一个能走的最远的无约束位置,如果找不到,就让他们两个分开了,这时候只要走小一点,慢慢走,默认第一个人走的比第二个人走的少; 但是会存在当前两个人位置不一样的情况,那就按小的位置来找能在一起的位置,不能的话,给小的位置找一个位置,然后就这样过了,233333333,具体思路自己体会吧~
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<list>
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
#define mem(a, b) memset(a, b, sizeof(a))
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const double eps = 1e-9;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int Maxn = 1e2 + 10;
int n, d;
bool f[Maxn], vis[Maxn];
int dis[Maxn];
bool Judge(int Max){
memset(vis, false, sizeof(vis));
int p1, p2, pos;
p1 = p2 = 0;
while(p1 <= n && p2 <= n){
if(p1 == p2){
pos = -1;
for(int i=p1+1;i<=n+1;i++){
if((dis[i] - dis[p1] <= Max) && (!f[i])) pos = i;
else break;
}
if(pos == -1){
pos = -1;
for(int i=p1+1;i<=n+1;i++){
if(dis[i] - dis[p1] <= Max && !vis[i]){
pos = i;
break;
}
}
if(pos == -1) return false;
vis[pos] = true;
p1 = pos;
pos = -1;
for(int i=p1+1;i<=n+1;i++){
if(dis[i] - dis[p2] <= Max && !vis[i]){
pos = i;
break;
}
}
if(pos == -1) return false;
vis[pos] = true;
p2 = pos;
}
else
{
if(pos == n+1) return true;
p1 = p2 = pos;
}
}
else
{
if(p1 > p2) swap(p1, p2);
pos = -1;
for(int i=p1+1;i<=n+1;i++){
if((dis[i] - dis[p1] <= Max) && (!f[i])) pos = i;
}
if(pos == -1){
for(int i=p1+1;i<=n+1;i++){
if((dis[i] - dis[p1] <= Max) && (!vis[i]))
{
pos = i;
break;
}
}
if(pos == -1) return false;
vis[pos] = true;
p1 = pos;
}
else{
if(pos == n+1) return true;
p1 = p2 = pos;
}
}
}
}
void Debug(){
for(int i=0;i<=n+1;i++)
printf("%d\n", f[i]);
}
void solve(){
int Mid;
int Left = 1, Right = d;
while(Left < Right){
Mid = Left + (Right - Left) / 2;
if(Judge(Mid)) Right = Mid;
else Left = Mid + 1;
}
printf("%d\n", Left);
}
int main(){
int T, cas = 1;
char ch;
scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &d);
getchar();
f[0] = false;
f[n+1] = false;
dis[0] = 0;
dis[n+1] = d;
for(int i=1;i<=n;i++){
scanf("%c-%d", &ch, &dis[i]);
getchar();
if(ch == 'S') f[i] = true;
else f[i] = false;
}
// Debug();
printf("Case %d: ", cas++);
solve();
}
return 0;
}