原题
1056 Mice and Rice (25 分)
翻译:Mice和Rice是编程竞赛的名称,在竞赛中,每个程序员必须编写一段代码来控制给定地图中老鼠的移动。每只老鼠的目标是吃尽可能多的米饭,以便成为肥老鼠。
首先NP个程序员随机决定游戏顺序。然后每NG个程序员被分在一组。一组中最胖的老鼠获胜并进入下一轮。所有输家的排名都一样。胜利者在下一场比赛中每NG人一组,直到最后一个胜利者被确定。
为了简单起见,假设程序员提交代码后,每个老鼠的重量是固定的。给定所有鼠标的重量和初始游戏顺序,您应该为程序员输出等级。
输入样例
11 3(NP NG)
25 18 0 46 37 3 19 22 57 56 10(每只老鼠质量,编号依次为 0 ~ NP-1 )
6 0 8 7 10 5 9 1 4 2 3( 初始游戏顺序 ,数字表示老鼠编号 )
输出样例
5 5 5 2 5 5 5 3 1 3 5
每个数字间空格隔开,最后一个数字后面没有空格
题意
给出NP只老鼠,并按规定的顺序每NG个一组,每组中最重的老鼠晋级下一轮,直到只有一直最重的老鼠,排名为1.把这些老鼠的排名按原来的输入顺序输出。
代码
#include<cstdio>
#include<queue>
using namespace std;
#define maxn 1010
struct mouse {
int weight;
int r;
}mouse[maxn]; //数组与结构体结合
int main()
{
int np, ng, order;
scanf ("%d%d", &np, &ng);//第一行输入np, ng
for ( int i = 0; i < np; i++ ){//第二行输入weight
scanf ( "%d", &mouse[ i ].weight );
}
queue < int > q;//游戏顺序存入队列
for ( int i = 0; i < np; i++ ){
scanf("%d", &order);
q.push(order);
}
int temp = np, group;//temp记录队列中元素数量
while ( q.size() != 1){
//分组
if ( temp % ng == 0 ) group = temp / ng;
else group = temp / ng + 1;
//遍历每组,遍历次数是组数group
for ( int i = 0; i < group; i++ ){
int k = q.front() ;
//找出每组中最大的老鼠,遍历次数是组成员数ng
for ( int j = 0; j < ng; j++ ){
if ( i*ng+j >= temp ) break;//计算是第几只老鼠,超过每组个数,出循环
int front = q.front() ;
if ( mouse[front].weight > mouse[k].weight )
k = front;
mouse[front].r = group + 1;//每轮名次是总组数加一
q.pop() ;//判断完就出队
}
q.push(k); //晋级的从队尾入队,不影响
}
temp = group;//下一轮队列中元素个数是这一轮的组数
}
mouse[q.front()].r = 1;//队列只剩一个元素,令其排名为1
for ( int i = 0; i < np; i++ ){
printf("%d", mouse[ i ].r );//数组中老鼠的顺序没动,只有其排名变了
if ( i < np - 1 )
printf(" ");//最后一个输出后没有空格
}
return 0;
}