PAT A1056 Mice an Rice

//参考晴天。。。 
//是否需要开一个队列数组
//并不需要,仔细想想队列的特性,先进先出,有利于一整轮的处理后再一整轮的处理 
#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;
} 

你可能感兴趣的:(C++,算法,队列,pat)