每次做PAT感觉自己都是个弱智。。。甚至怀疑自己是不是不适合CS。。。。他妈的这道题思路居然是看的;
这道题其实最核心的思路就是怎么解决迭代问题,还有RANK的计数问题;
首先题目是相当于循环赛的形式,所以一开始就要发现轮次的联系。RANK排名其实在本题目中就是轮次+1的关系;
首先将所有的老鼠入队列,假如一共N组,每组M个,就将队列中每M个选出最大的,塞到队尾,规定RANK值,操作N次,此时,队列中的元素就全是优胜者;
重复上述操作直至队列中只有一个元素,这个时候,这就是最胖的老鼠;
代码如下所示:
#include<stdlib.h>
#include<stdio.h>
#include<vector>
#include<queue>
using std::queue;
const int maxn=1010;
struct node{
int weight;
int rank;
}mouse[maxn];
int main(){
int np,ng,order;
scanf("%d%d",&np,&ng);
for(int i=0;i<np;i++){
scanf("%d",&mouse[i].weight);
}
queue<int>q;
for(int i=0;i<np;i++){
scanf("%d",&order);
q.push(order);
}
int temp=np,group;
while(q.size()!=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;
int front=q.front();
if(mouse[front].weight>mouse[k].weight){
k=front;
}
mouse[front].rank=group+1;
q.pop();
}
q.push(k);
}
temp=group;
}
mouse[q.front()].rank=1;
for(int i=0;i<np;i++){
printf("%d",mouse[i].rank);
if(i<np-1){
printf(" ");
}
}
system("pause");
return 0;
}