模拟二维循环队列,简单题一遍AC,但花了不少时间。zoj上AC500道了,还需加油。
#include <cstdio>
#include <string>
int T, N, q[1000][1000], idx[1000000], cs = 0;
int rop, red, cop[1000], ced[1000], tUsed[1000];
char str[10];
int init ()
...{
scanf ( "%d", &T );
if ( T )
printf ( "Scenario #%d ", ++ cs );
int i, j, x;
for ( i = 0; i < T; i ++ )
...{
scanf ( "%d", &N );
for ( j = 0; j < N; j ++ )
...{
scanf ( "%d", &x );
idx[x] = i;
}
}
rop = 0, red = 0;
memset ( cop, 0x00, sizeof ( cop ) );
memset ( ced, 0x00, sizeof ( ced ) );
memset ( tUsed, 0xff, sizeof ( tUsed ) );
return T;
}
void enqueue ()
...{
int i, j, x, t;
scanf ( "%d", &x );
t = idx[x];
if ( tUsed[t] == -1 ) // team没有排队,插入下一行
...{
i = red, j = ced[i];
tUsed[t] = i;
q[i][j] = x;
ced[i] ++, red ++;
if ( ced[i] == 1000 )
ced[i] = 0;
if ( red == 1000 )
red = 0;
}
else //team已经有排队,插队
...{
i = tUsed[t], j = ced[i];
q[i][j] = x;
ced[i] ++;
if ( ced[i] == 1000 )
ced[i] = 0;
}
}
void dequeue ()
...{
int i, j, x, t;
i = rop, j = cop[i], x = q[i][j], t = idx[x];
printf ( "%d ", x );
cop[i] ++;
if ( cop[i] == 1000 )
cop[i] = 0;
if ( cop[i] == ced[i] ) //此行已空
...{
rop ++;
if ( rop == 1000 )
rop = 0;
tUsed[t] = -1;
}
}
void proc ()
...{
while ( scanf ( "%s", str ) )
...{
if ( !strcmp ( str, "STOP" ) )
...{
printf ( " " );
break;
}
else if ( !strcmp ( str, "DEQUEUE" ) )
dequeue ();
else
enqueue ();
//pq ();
}
}
int main ()
...{
//freopen ( "in.txt", "r", stdin );
while ( init () )
...{
proc ();
}
return 0;
}
#include <string>
int T, N, q[1000][1000], idx[1000000], cs = 0;
int rop, red, cop[1000], ced[1000], tUsed[1000];
char str[10];
int init ()
...{
scanf ( "%d", &T );
if ( T )
printf ( "Scenario #%d ", ++ cs );
int i, j, x;
for ( i = 0; i < T; i ++ )
...{
scanf ( "%d", &N );
for ( j = 0; j < N; j ++ )
...{
scanf ( "%d", &x );
idx[x] = i;
}
}
rop = 0, red = 0;
memset ( cop, 0x00, sizeof ( cop ) );
memset ( ced, 0x00, sizeof ( ced ) );
memset ( tUsed, 0xff, sizeof ( tUsed ) );
return T;
}
void enqueue ()
...{
int i, j, x, t;
scanf ( "%d", &x );
t = idx[x];
if ( tUsed[t] == -1 ) // team没有排队,插入下一行
...{
i = red, j = ced[i];
tUsed[t] = i;
q[i][j] = x;
ced[i] ++, red ++;
if ( ced[i] == 1000 )
ced[i] = 0;
if ( red == 1000 )
red = 0;
}
else //team已经有排队,插队
...{
i = tUsed[t], j = ced[i];
q[i][j] = x;
ced[i] ++;
if ( ced[i] == 1000 )
ced[i] = 0;
}
}
void dequeue ()
...{
int i, j, x, t;
i = rop, j = cop[i], x = q[i][j], t = idx[x];
printf ( "%d ", x );
cop[i] ++;
if ( cop[i] == 1000 )
cop[i] = 0;
if ( cop[i] == ced[i] ) //此行已空
...{
rop ++;
if ( rop == 1000 )
rop = 0;
tUsed[t] = -1;
}
}
void proc ()
...{
while ( scanf ( "%s", str ) )
...{
if ( !strcmp ( str, "STOP" ) )
...{
printf ( " " );
break;
}
else if ( !strcmp ( str, "DEQUEUE" ) )
dequeue ();
else
enqueue ();
//pq ();
}
}
int main ()
...{
//freopen ( "in.txt", "r", stdin );
while ( init () )
...{
proc ();
}
return 0;
}