//参考晴天。。。
//是否需要开一个队列数组
//并不需要,仔细想想队列的特性,先进先出,有利于一整轮的处理后再一整轮的处理
#include<cstdio>
#include<queue>
//#define LOCAL
using namespace std;
struct Mice{
int weight;
int rank;
}mice[1010];
queue<int> qu;//队列是int,存放序号即可.更不需要队列数组!
int main(){
#ifdef LOCAL
freopen("A1056data.in","r",stdin);
freopen("A1056data.out","w",stdout);
#endif
int np,ng,order;
scanf("%d%d",&np,&ng);
for(int i=0;i<np;i++){
scanf("%d",&mice[i].weight);
}
for(int i=0;i<np;i++){
scanf("%d",&order);//按顺序将老鼠的标号入队
qu.push(order);
}
int temp=np,group;//temp为当前轮的比赛老鼠总数,group为组数
//三重循环,要好好理解
while(qu.size()!=1){//注意这里不能写size!=0.否则,group会为1,这唯一一个mice的排名会为2
//计算group.即当前轮分为几组
if(temp%ng==0){
group=temp/ng;
}
else{
group=temp/ng+1;
}
for(int i=0;i<group;i++){//恩这里上界确实是group,表示需要几组的比拼
int k=qu.front();
for(int j=0;j<ng;j++){
if(i*ng+j>=temp) break;//这将在最后一轮老鼠数量小ng时起作用
int front=qu.front();//队首老鼠编号
if(mice[front].weight>mice[k].weight){
k=front;
}
//不论是不是比第一个大,都要弹出。如果大,就把序号记录下来
mice[front].rank=group+1;//注意这里的排名赋值。这一轮结束后,会有group个老鼠晋级,所以这一轮刷下来的都是group+1名
qu.pop();//出队这只老鼠
}
qu.push(k);//把这只老鼠入队,下一轮处理
}
temp=group;//group只老鼠晋级,所以老鼠数目变为group
}
mice[qu.front()].rank=1;//这个1一定要出来赋值
for(int i=0;i<np;i++){
printf("%d",mice[i].rank);
if(i!=np-1) printf(" ");
}
return 0;
}
PAT A1056 Mice an Rice
最新推荐文章于 2020-06-23 22:24:03 发布
本文介绍了一种通过模拟比赛过程来确定老鼠赛跑排名的算法。利用队列数据结构存储参赛老鼠的序号,每轮比赛淘汰除最强者外的所有老鼠,直至决出冠军。详细解析了算法的实现细节及核心代码。
461

被折叠的 条评论
为什么被折叠?



