Data structure
We must simulate the passage of time to compute waiting time...
We need to keep these important information of messages:
int now = 0; // Current time
int lastEventTime = 0; // Time of the last event
int recvTime[101]; // recvTime[k] = time that the msg from friend k
// was received
int waitTime[101]; // waitTime[k] = total wait time for friend k
Initialization:
for ( int i = 1; i <= 100; i++ )
{
recvTime[i] = 0;
waitTime[i] = 0;
}
|
How to simlate passing of time
Sample input:
5
R 2
R 3
W 5
S 2
S 3
now = 0
|
How to simlate passing of time
Sample input:
5
R 2
R 3
W 5
S 2
S 3
now = 0 R 2 ----------> lastEventTime = now (= 0)
recvTime[2] = now (= 0)
now = 1 <--- advance time !
|
How to simlate passing of time
Sample input:
5
R 2
R 3
W 5
S 2
S 3
now = 0 R 2 ----------> lastEventTime = now (= 0)
recvTime[2] = now (= 0)
now = 1 R 3 ----------> lastEventTime = now (= 1)
recvTime[3] = now (= 1)
now = 2
|
How to simlate passing of time
Sample input:
5
R 2
R 3
W 5
S 2
S 3
now = 0 R 2 ----------> lastEventTime = now (= 0)
recvTime[2] = now (= 0)
now = 1 R 3 ----------> lastEventTime = now (= 1)
recvTime[3] = now (= 1)
now = 2 W 5 1 + 5 = 6
now = 6
|
How to simlate passing of time
Sample input:
5
R 2
R 3
W 5
S 2
S 3
now = 0 R 2 ----------> lastEventTime = now (= 0)
recvTime[2] = now (= 0)
now = 1 R 3 ----------> lastEventTime = now (= 1)
recvTime[3] = now (= 1)
now = 2 W 5 1 + 5 = 6
now = 6 S 2 ----------> lastEventTime = now (= 6)
delay = now - 0 = 6
|
How to simlate passing of time
Sample input:
5
R 2
R 3
W 5
S 2
S 3
now = 0 R 2 ----------> lastEventTime = now (= 0)
recvTime[2] = now (= 0)
now = 1 R 3 ----------> lastEventTime = now (= 1)
recvTime[3] = now (= 1)
now = 2 W 5 1 + 5 = 6
now = 6 S 2 ----------> lastEventTime = now (= 6)
delay = now - 0 = 6
now = 7 S 3 ----------> lastEventTime = now (= 7)
delay = now - 1 = 6
|
J4 solution in C++
cin >> M;
int now = 0, lastEventTime = 0;
for ( int i = 0; i < M; i++ )
{
cin >> action;
cin >> frID;
if ( action == 'R' )
{
lastEventTime = now; // Record lastEventTime
recvTime[frID] = now; // Record msg recv time
now++; // Advance clock
}
else if ( action == 'S' )
{
lastEventTime = now; // Record lastEventTime
// Compute cumulative delay
int delay = now - recvTime[frID];
waitTime[frID] += delay;
recvTime[frID] = 0; // Reset (no lingering msg)
now++; // Advance clock
}
else
{ // W frID
now = lastEventTime + frID; // Advance time
}
}
for ( int i = 0; i <= 100; i++ )
if ( recvTime[i] > 0 )
cout << i << " " << -1 << endl; // Lingering msg
else if ( waitTime[i] > 0 )
cout << i << " " << waitTime[i] << endl;
|
❮
❯