PAT A1056 Mice and Rice

自作多情 提交于 2020-03-03 11:45:35

题目难度:三颗半星
题目大意:给出N个老鼠的体重,然后每K个一组,拿出每组重量最重的继续比较,然后给相应的老鼠排名。
题目坑点:看完题目感觉不难,但是到了排名的时候,困扰了很久,一直以为像之前的模拟题,算出每个老鼠的排名,最后再遍历一遍就好,但是完全不是这样。
这里轮的概念,需要用到队列,即先所有的老鼠进队,然后挨个出队,每出队K个老鼠,就将已经出队的K个老鼠中最重的那个序号继续进队,这里还有一个我没有想到的点就是,出队之后的老鼠,就等于当前分组数加一。仔细一想,确实是这样,因为分成了若干组,每个组需要给出一个最大的,因而这几个的排名就占了当前的分组数,因此,剔除出队的排名自然就是当前的组数+1。

代码如下:(完全是抄的算法笔记。。。害臊)

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
typedef struct{
	int weight,rank;
}Mouse;
Mouse mice[1005];
int main(){
	int N,step;
	cin>>N>>step;
	int num;
	queue<int> q;
	for(int i=0;i<N;i++){
		cin>>mice[i].weight;
	}
		
	for(int i=0;i<N;i++){
		cin>>num;
		q.push(num);
	}
	int temp=N,group;
	while(q.size()!=1){
		if(temp%step==0)
			group=temp/step;
		else
			group=temp/step+1;
		for(int i=0;i<group;i++){
			int k=q.front();
			for(int j=0;j<step;j++){
				if(i*step+j>=temp)
					break;
				int front=q.front();
				if(mice[front].weight>mice[k].weight){
					k=front;
				}
				mice[front].rank=group+1;
				q.pop();
			}
			q.push(k);
		}
		temp=group;
	}
	mice[q.front()].rank=1;
	for(int i=0;i<N;i++){
		cout<<mice[i].rank;
		if(i!=N-1)
			cout<<" ";
	}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!