PAT A1056マウスとライス(25ポイント)

質問
へのリンク注:
1. 質問での競争の順序は、実際にはマウス番号の順序です。つまり、6番のマウスが最初にランク付けされ、0番のマウスが2番目にランク付けされ、以下同様に続きます。
2.キューを使用して参加マウスを処理します。1匹のマウスを処理した後、キューを離れます。プロモートマウスは、キュー内の1匹のマウスだけがチャンピオンを決定するまで、キューに繰り返し入る必要があります。
3.アルゴリズムは3つのループで構成され、最も外側のループはラウンド数を処理し、内側の層は処理グループで、最も内側のループは各グループの各マウスを処理します。
4.競争の各ラウンドに参加するラットの数は異なり、最初はnpで、分割されたグループの数は後で、np / ngが分割されている場合、グループ番号はnp / ngです。分割されていない場合、グループ番号はnp / ng + 1です。 。各グループにはプロモーションがあり、その前にマウスのグループが存在する必要があるため、非前進マウスのランキングは現在のグループ番号グループ+ 1です。

#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件のオリジナル記事を公開 Likes0 Visits 642

おすすめ

転載: blog.csdn.net/weixin_44546393/article/details/105621487