Code: Select all
2 10 10
0 left
10 left
20 left
30 left
40 left
50 left
60 left
70 left
80 left
90 left
2 10 3
10 right
25 left
40 left
3 5 7
0 left
1 left
2 left
3 left
5 left
5 right
11 right
2 24 7
2 right
7 left
12 right
22 right
34 right
73 right
76 right
I get all those cases correct. However, I get these two wrong:
Code: Select all
1 10 3
0 left
10 right
30 left
4 3 8
5102 left
8090 right
9875 left
14954 left
19584 right
31434 left
76546 left
77138 left
Correct output
Code: Select all
10
20
40
5105
8093
9878
14960
19587
31437
76552
77144
My output
Code: Select all
10
20
50
8099
8096
9881
14960
31443
31440
76552
77144
So I'm not that far away, I'm doing something wrong and I can't find out what, here's my full code:
Code: Select all
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct boat
{
int arrival_time;
int final_time;
int index;
};
int cases, n, t, m, i, v, time, new_boat_time, boats_carrying;
bool left_side;
char side[6];
queue<boat> right, left;
vector<boat> output;
void read_input()
{
scanf("%d %d %d", &n, &t, &m);
output.clear();
for (i = 0; i < m; i++)
{
scanf("%d %s", &new_boat_time, side);
boat new_boat;
new_boat.arrival_time = new_boat_time;
new_boat.final_time = 0;
new_boat.index = (int) output.size();
if (strcmp(side, "right") == 0)
{
right.push(new_boat);
}
else
{
left.push(new_boat);
}
output.push_back(new_boat);
}
}
int main()
{
scanf("%d", &cases);
for (v = 0; v < cases; v++)
{
read_input();
left_side = true;
time = 0;
while (!(right.empty() && left.empty()))
{
boats_carrying = 0;
if (left_side)
{
for (i = 0; i < n; i++)
{
if (!left.empty())
{
if (left.front().arrival_time <= time)
{
//printf("%d\n", time + t);
output[left.front().index].final_time = time + t;
left.pop();
boats_carrying++;
}
}
}
if (boats_carrying > 0)
{
time += t;
}
else
{
if (right.front().arrival_time > time)
{
time += t + right.front().arrival_time - time;
}
else
{
time += t;
}
}
}
else
{
for (i = 0; i < n; i++)
{
if (!right.empty())
{
if (right.front().arrival_time <= time)
{
//printf("%d\n", time + t);
output[right.front().index].final_time = time + t;
right.pop();
boats_carrying++;
}
}
}
if (boats_carrying > 0)
{
time += t;
}
else
{
if (left.front().arrival_time > time)
{
time += t + left.front().arrival_time - time;
}
else
{
time += t;
}
}
}
left_side = !left_side;
}
for (i = 0; i < (int) output.size(); i++)
{
printf("%d\n", output[i].final_time);
}
if (v != cases - 1)
{
printf("\n");
}
}
return 0;
}