Mice and Rice is the name of a programming contest in which each programmer must write a piece of code to control the movements of a mouse in a given map. The goal of each mouse is to eat as much rice as possible in order to become a FatMouse.
First the playing order is randomly decided for NP programmers. Then every NGprogrammers are grouped in a match. The fattest mouse in a group wins and enters the next turn. All the losers in this turn are ranked the same. Every NG winners are then grouped in the next match until a final winner is determined.
For the sake of simplicity, assume that the weight of each mouse is fixed once the programmer submits his/her code. Given the weights of all the mice and the initial playing order, you are supposed to output the ranks for the programmers.
Input Specification:
Each input file contains one test case. For each case, the first line contains 2 positive integers: NP and NG (≤1000), the number of programmers and the maximum number of mice in a group, respectively. If there are less than NG mice at the end of the player's list, then all the mice left will be put into the last group. The second line contains NP distinct non-negative numbers Wi (i=0,⋯,NP−1) where each Wi is the weight of the i-th mouse respectively. The third line gives the initial playing order which is a permutation of 0,⋯,NP−1 (assume that the programmers are numbered from 0 to NP−1). All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the final ranks in a line. The i-th number is the rank of the i-th programmer, and all the numbers must be separated by a space, with no extra space at the end of the line.
Sample Input:
11 3
25 18 0 46 37 3 19 22 57 56 10
6 0 8 7 10 5 9 1 4 2 3
Sample Output:
5 5 5 2 5 5 5 3 1 3 5
题目大意:给出np只老鼠,每ng个分一组,最后不足ng只的也分一组。给出0~N编号每只老鼠的体重,并给出他们的初始排列序号。每组选一个最重的晋级,那么每轮晋级group组个。对于这些晋级的老鼠,再按上面每ng个分一组~~直到第一名产生。
分析:
1)用结构体存储老鼠体重,开一个队列queue保存初始排列序号,用序列号q.front( ) 访问每组老鼠体重,然后模拟一下比赛规则即可。具体细节看代码注释~
完整代码:
#include<bits/stdc++.h>
using namespace std;
struct mouse{
int weight;
int rank;
}mouse[1010];
int main(){
int np,ng,order;
cin>>np>>ng;
for(int i=0;i<np;i++)
cin>>mouse[i].weight;
queue<int>q;
for(int i=0;i<np;i++){
cin>>order;
q.push(order);
}
int temp=np,group;//temp保存每轮的老鼠总数,group保存分组个数
while(q.size()!=1){ //剩一只mouse就不用比赛了
group= temp%ng? temp/ng+1:temp/ng;//此轮分组个数
for(int i=0;i<group;i++){
int Max_Id=q.front();//Max_Id保存改组最大老鼠编号
for(int j=0;j<ng;j++){
if(i*ng+j>=temp) break;//处理最后一组不足np,跳出
int front= q.front();
q.pop();
if(mouse[front].weight >mouse[Max_Id].weight ){
Max_Id=front;
}
mouse[front].rank=group+1;
/*每一轮晋级group个,排名刷新。虽然这里边的front编号包含k编号(每组最大的那个编号)
也就是mouse[k].rank=group+1,但后面会将k编号入栈,实际上mouse[k].rank是不断变化的。
*/
}
q.push(Max_Id);
}
temp=group;//刷新下一轮老鼠总数。
}
mouse[q.front()].rank =1;
for(int i=0;i<np;i++)
printf("%d%s",mouse[i].rank ,i<np-1?" ":"");
return 0;
}
That’s all!