PAT甲级1056 Mice and Rice (25 分)思路
- 题意:第一行给出NP,NG。其中老鼠数量为NP,每NG个老鼠分一组,第二行给出下标从0–NP-1顺序的老鼠质量,第三行给出老鼠的分组顺序,就是按照这个顺序来根据NG对老鼠分组(最后的老鼠不满一组时也分为一组)。其中每个分组中都得到质量最大的老鼠晋级进行下一轮排名,被淘汰的老鼠排名相同,直到得到第一名,要求按顺序输出每个老鼠的排名。
- 思路:应用到队列的知识,参考《算法笔记》,有如下思路:
- step1:建立结构体mouse,存储老鼠质量和排名。
- step2:用temp记录当前轮的参赛老鼠数,(初值为NP),group记录当前轮的组数(这里要注意group的计算,若能刚好分组和不能刚好分组两种情况),初始时把老鼠们的编号按顺序加入队列。
- step3:while循环(当q.empty()!=1时,一直执行),接下来对每一轮比赛,枚举当前轮的temp只老鼠,按每NG只老鼠一组选出质量最大的老鼠,将其入队表示晋级,当前老鼠的排名在选出最大质量老鼠的过程中赋值为group+1(因为晋级的老鼠会在下一轮晋级中更新排名,所以现在都可以赋值为group+1),只剩下最后一只老鼠时,对其排名赋值为1。
- step4:输出。
去写代码:(主要源于《算法笔记》,把树图的知识点学完之后回来二刷)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int weight;
int R;
}mouse[1010];
int main()
{
int np,ng,order;
queue<int>q;
cin>>np>>ng;
for(int i=0;i<np;i++)
{
scanf("%d",&mouse[i].weight);
}
for(int i=0;i<np;i++)
{
scanf("%d",&order);
q.push(order);
}
int temp=np,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();
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;
for(int i=0;i<np;i++)
{
if(i==0)printf("%d",mouse[i].R);
else printf(" %d",mouse[i].R);
}
return 0;
}