pat A1056
题意:
输入:
1.输入np,ng分别表示总的人数和每组人数
2.输入每只老鼠的体重,其中老鼠的体重对应的从0,1,2,3,4,5,6…下标开始
3.输入初始的顺序,比如6对应的体重是19,0对应的体重是25以此类推
参考代码:
/*
1.等级=划分的组数+1
2.下一组的人数=上一组的组数
3.结构数组存放两个值:1.体重 2.编号
4.将老鼠的排序放到队列中
5.核心思路:遍历每一组,从每一组中找到体重最大的老鼠,加入到队列中,以便下次判断
6.这道题的还有个特点---关于划分后的剩余的人数的那一组进行的遍历
for(int i=0; i<group; i++)
for(int j=0; j<ng; j++)
{
if(i*ng+j>=temp) 作用1:如果最后1组只剩下一个人,自然就是取出队首元素,然后再入队
作用2: 这个的实质表示遍历到本系列的最后一个人,直接退出内层for循环,就不用后面的pop了,不然程序没有任何输出
break; 作用3:i*ng表示前面遍历过的总人数,而后面+0,+1,+2....就是直接到本系列的最后一个人就直接退出
}
*/
#include<iostream>
#include<queue>
using namespace std;
const int maxn=1004;
struct node
{
int weight;
int order;
}mice[maxn];
int main()
{
int np,ng;
queue<int> q;
cin >> np >> ng;
for(int i=0; i<np; i++)
{
cin >> mice[i].weight;
}
for(int i=0; i<np; i++)
{
int temp;
cin >> temp;
q.push(temp);
}
int temp=np,group;
while(q.size()!=1) //最后队列里剩下的最后一个人,要标记其排名为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;
if(mice[k].weight<mice[q.front()].weight)
k=q.front();
mice[q.front()].order=group+1;
q.pop();
}
q.push(k);
}
temp=group;
}
mice[q.front()].order=1;
for(int i=0; i<np; i++)
{
if(i!=0)
cout << " ";
cout << mice[i].order;
}
return 0;
}