#include <stdio.h>
int main()
{
float a[11] = {
1.73,1.75,1.78,1.81,1.84,1.87,1.88,1.88,1.89,1.90
}
float b = 1.82
int i
for(i = 9i >= 0--i) {
if(a[i] >b) a[i+1] = a[i]
else break
}
a[i+1] = b
for(i=0i<11++i) printf("%.2f ", a[i])
}
#include<stdio.h>
int main()
{
float x=1.82,a[10]={1.73,1.75,1.78,1.84,1.88,1.89,1.90}
int i,j,n=7
for(i=n-1i>=0&&a[i]>xi--)
a[i+1]=a[i]
a[i+1]=x
n++
for(i=0i<ni++)
printf("%.2f ",a[i])
printf("\n")
return 0
}
这题真麻烦,终于写完了。我得思路是这样的,这道题其实就是维护2个队列。
我把每个组的人当成一个人,而这些人排队就可以看成组与组之间的排队,这是第一个队列,也就是gqueue
然后每个组也都是一个队列,里面顺序排着每个组的人。
描述完成了,然后就是进队出队的问题了。
进队时首先查看自己所在的组有没有在gqueue中,team_in数组保存了每个组在gqueue中的位置,当然一开始都是-1,表示没有入队。如果自己的组在gqueue中,那么就直接加入自己所在组的队列中。如果没有自己的组,就让他所代表的组入gqueue。
出队时出gqueue中第一个组的第一个人,判断一下这个组是不是没有人了,要是没有人了就把这个组dequeue。
大概思路就是这样,还有要注意的就是我用h_table存储哈西表,代表着每个人所在的组的编号,这样把人名shash以下就可以知道他所处的组。
#include <stdio.h>
#include <string.h>
struct person
{
char name[ 5 ]
int team
}
struct pqueue //组内队列
{
person p[ 1001 ]
int head, tail
}
struct gqueue//组队列
{
pqueue pq[ 1001 ]
int head, tail
}
int n, h_table[ 100000 ], team_in[ 1001 ]
gqueue q
void p_enqueue ( person a, pqueue &q )
{
q.p[ q.tail ] = a
q.tail++
if ( q.tail == 1001 )
q.tail = 0
}
void g_enqueue ( person a, gqueue &q )
{
if ( team_in[ a.team ] != -1 )
p_enqueue( a, q.pq[ team_in[ a.team ] ] )
else
{
q.pq[ q.tail ].head = 0
q.pq[ q.tail ].tail = 0
team_in[ a.team ] = q.tail
p_enqueue( a, q.pq[ q.tail ] )
q.tail++
if ( q.tail == 1001 )
q.tail = 0
}
}
void p_dequeue( pqueue &q )
{
printf("%s\n", q.p[ q.head ].name )
q.head++
if ( q.head == 1001 )
q.head = 0
}
person g_dequeue( gqueue &q )
{
int t = q.pq[ q.head ].p[ q.pq[ q.head ].head ].team
p_dequeue( q.pq[ q.head ] )
if ( q.pq[ q.head ].tail == q.pq[ q.head ].head )
{
team_in[ t ] = -1
q.head++
if ( q.head == 1001 )
q.head = 0
}
}
int shash( char *key )
{
unsigned long h = 0
while( *key )
{
h = ( h << 4 ) + *key++
unsigned long g = h & 0Xf0000000L
if ( g ) h ^= g >> 24
h &= ~g
}
return h % 100000
}
void init( )
{
int i, j, t
person per
for ( i = 0 i < n i++ )
{
team_in[ i ] = -1
scanf("%d", &t)
for ( j = 0 j < t j++ )
{
scanf("%s", per.name)
per.team = i
h_table[ shash( per.name ) ] = i
}
}
q.head = q.tail = 0
}
void work( )
{
char command[ 10 ]
person per
while ( scanf("%s", command) != EOF )
{
if ( strcmp( command, "STOP" ) == 0 )
break
if ( strcmp( command, "DEQUEUE" ) == 0 )
g_dequeue( q )
if ( strcmp( command, "ENQUEUE" ) == 0 )
{
scanf("%s", per.name)
per.team = h_table[ shash( per.name ) ]
g_enqueue( per, q )
}
}
}
int main( )
{
freopen("input.txt", "r", stdin)
freopen("output.txt", "w", stdout)
int time = 1
while ( scanf("%d", &n) != EOF && n )
{
printf("Scenario #%d\n", time++)
init( )
work( )
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)