1056 Mice and Rice

1056 Mice and Rice

题目大意

Np只老鼠,每次分为若干组晋级(每组数量始终为Ng),一直比赛知道只剩一只老鼠。具体比赛制度看英文,有点难懂。

注意

1、队列的使用
2、每组未晋级的老鼠排名为每轮比赛的组数group+1,如果晋级,排名会在下一轮比赛是覆盖。
3、考虑只有1只老鼠的特殊情况,在循环结束后还要对排名第一的老鼠赋值。
4、最后一组老鼠数不足Ng只时要跳出循环。

代码

#include<stdio.h>
#include<iostream>
#include<queue>

using namespace std;
struct Mouse{
    int weight;
    int rank;
}M[1001];
queue<int> q;
int main(void){
    int np,ng;
    scanf("%d%d",&np,&ng);
    for(int i=0;i<np;i++)scanf("%d",&M[i].weight);
    for(int i=0;i<np;i++){
        int tmp;
        scanf("%d",&tmp);
        q.push(tmp);//初始序列
    }
    int group;//每轮比赛的组数,淘汰老鼠的名次=group+1
    int num=np;//每轮比赛的总老鼠数
    while(q.size()!=1){
        if(num%ng==0)group=num/ng; 
        else group=num/ng+1;
        //开始每一组的比赛
        for(int i=0;i<group;i++){
            int max=q.front();//存储每组晋级的序号
            for(int j=0;j<ng;j++){
                if(i*ng+j>=num)break;//如果最后一组老鼠数不足ng
                int front=q.front();
                if(M[front].weight>M[max].weight){
                    max=front;//如果当前队首的weight比max大
                }
                M[front].rank=group+1;//比过赛就出队,排名为group+1,如果晋级的话,排名会被覆盖。
                q.pop();
            }
            q.push(max);//晋级的再入队
        }
        num=group;//进入下一轮,老鼠数量减少为group
    }
    M[q.front()].rank=1;
    for(int i=0;i<np;i++){
            if(i==np-1)printf("%d",M[i].rank);
            else printf("%d ",M[i].rank);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值