【HDOJ】1406 Ferry Loading III

时间:2023-11-12 12:24:38

模拟,注意需要比较队头与当前时间的大小关系。

 #include <cstdio>
#include <cstring>
#include <cstdlib> #define MAXN 10005
#define INF 0xffffff typedef struct {
int i, t;
} node_t; node_t Q[][MAXN];
int buf[MAXN];
int rear[], front[]; int main() {
int case_n;
int n, t, m;
int i, j, k, a;
int d;
char s[]; #ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif scanf("%d", &case_n);
for (a=; a<case_n; ++a) {
scanf("%d %d %d", &n, &t, &m);
rear[] = rear[] = ;
front[] = front[] = ;
for (i=; i<=m; ++i) {
scanf("%d %s", &k, s);
if (s[] == 'l')
j = ;
else
j = ;
Q[j][rear[j]].i = i;
Q[j][rear[j]].t = k;
rear[j]++;
}
Q[][rear[]].t = INF;
Q[][rear[]].t = INF;
d = ;
int ans = ;
while (front[]<rear[] || front[]<rear[]) {
if (Q[d][front[d]].t>ans && Q[!d][front[!d]].t<=ans) {
ans += t;
d = !d;
} else if ((Q[d][front[d]].t>Q[!d][front[!d]].t || front[d]>=rear[d]) && Q[!d][front[!d]].t>ans) {
ans = Q[!d][front[!d]].t + t;
d = !d;
}
if (ans < Q[d][front[d]].t)
ans = Q[d][front[d]].t;
j = ;
i = front[d];
while (j<n && i<rear[d] && Q[d][i].t<=ans) {
buf[Q[d][i].i] = ans + t;
++j;
++i;
}
ans += t;
front[d] = i;
d = !d;
}
if (a)
printf("\n");
for (i=; i<=m; ++i)
printf("%d\n", buf[i]);
} return ;
}