PAT A1056 Mice an Rice

来源:互联网 发布:轩辕剑修罗进阶数据 编辑:程序博客网 时间:2024/05/16 18:34
//参考晴天。。。 //是否需要开一个队列数组//并不需要,仔细想想队列的特性,先进先出,有利于一整轮的处理后再一整轮的处理 #include<cstdio>#include<queue>//#define LOCALusing namespace std;struct Mice{int weight;int rank;}mice[1010];queue<int> qu;//队列是int,存放序号即可.更不需要队列数组!  int main(){#ifdef LOCALfreopen("A1056data.in","r",stdin);freopen("A1056data.out","w",stdout);#endifint 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;} 

0 0
原创粉丝点击