PAT A1056 Mice and Rice (25point(s))

题目链接
注意点:
1.题中的比赛顺序其实是老鼠编号的顺序,即6号老鼠排第一个,0号老鼠排第二个…以此类推。
2.要用一个队列来处理参赛的老鼠,处理完一个老鼠就出队列,晋级的老鼠要反复入队列,直到队列中只有一个老鼠即决出冠军。
3.算法由三个循环构成,最外层循环是处理比赛轮数,里面一层是处理组,最里面是处理每组的每只老鼠。
4.参赛的老鼠数每轮比赛都不同,初始为np,以后为划分的组数,如果np/ng整除,组数group就是np/ng;如果不整除,组数group就是np/ng+1。未晋级的老鼠排名是当前组数group+1,因为每组都有一位晋级,在它前面的一定有group只老鼠。

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct mouse{//老鼠结构体
    int weigth,rank;//重量和排名
}programmer[1010];
queue<int> q;
int main(){
    int np,ng,order;
    scanf("%d%d",&np,&ng);
    for(int i=0;i<np;i++){//输入重量
        scanf("%d",&programmer[i].weigth);
    }
    for(int i=0;i<np;i++){//按序输入编号
        scanf("%d",&order);
        q.push(order);//将编号入队,按照这个顺序进行后续处理
    }
    int temp=np,group;//temp为目前参赛的老鼠数,group为目前的组数
    while(q.size()!=1){//决出冠军则跳出循环
        if(temp%ng==0) group=temp/ng;//完全分组求组数
        else group=temp/ng+1;//不完全分组求组数
        for(int i=0;i<group;i++){//对每组进行处理
            int k=q.front();//k为当前组最大重量老鼠的编号
            for(int j=0;j<ng;j++){//对组中每只老鼠遍历
                if(i*ng+j>=temp) break; 
                //最后一组老鼠数不足ng时可以跳出循环
                int front=q.front();//队首老鼠的编号
                if(programmer[front].weigth>programmer[k].weigth){
                    //找出本组最重老鼠的编号
                    k=front;
                }
                programmer[front].rank=group+1;
                //该轮老鼠排名为group+1
                q.pop();//将这只老鼠出队
            }
            q.push(k);//晋级的老鼠重新入队有机会修改排名
        }
        temp=group;//下轮参赛的老鼠数为group
        }
        programmer[q.front()].rank=1;//最后一个老鼠是冠军
        for(int i=0;i<np;i++){//输出所有老鼠的排名
            printf("%d",programmer[i].rank);
            if(i<np-1) printf(" "); 
        }
    return 0;
}
发布了81 篇原创文章 · 获赞 0 · 访问量 642

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105621487