题目
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 NG programmers 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
解题思路
题意是:第二行给出体重,第三行给出老鼠编号的顺序,每NG个一组(不足NG个的最后几只老鼠,全部在一个组中(原文: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. )),选出体重最大的,进入下一轮的比赛。
比如题目中给出的样例,比较过程如下:
25 18 0 46 37 3 19 22 57 56 10
6 0 8 7 10 5 9 1 4 2 3
第一次比较:
1(18) 0(25) 8(57) -> 8(57)
7(22) 10(10) 5(3) -> 7(22)
9(56) 1(18) 4(37) -> 9(56)
2(0) 3(46) -> 3(46)
被淘汰序号:0 1 2 4 5 6 10
第二次比较:
8(57) 7(22) 9(56) -> 8(57)
3(46) -> 3(46)
被淘汰序号:7 9
第三次比较
8(57) 3(46) -> 8(57)
被淘汰序号:3
最后胜者:8
5 5 5 2 5 5 5 3 1 3 5
易错点
本轮被淘汰小鼠对应位置最终输出的数字应该是晋级到下一轮的小鼠的数目加一,相应的,最后的胜者输出1。
代码
#include<bits/stdc++.h>
using namespace std;
int NP,NG,stage=0;
queue <int> p;//记录当前胜者编号
int Min(int a, int b){
return (a<b)?a:b;
}
int Max(int a, int b){
return (a>b)?a:b;
}
void Rank(int W[], int rank[]){
int max,temp,i,j,len = p.size();
int left = len%NG;
int end = len-left,endj;
int sub[len/NG+1],k=0;//记录数组长度
for (i=0;i<len;)
{
max = W[p.front()];//每一组当中的最大体重,假设是第一个
endj = (i==end)?len:Min(len,i+NG);//防止小鼠的数目不足NG
for (i;i<endj;i++)//遍历组内
{
temp = p.front();
rank[temp] = stage;
p.pop();
if (W[temp]>=max)//这个地方一定要取等于,或者之前赋值max时就要把sub[k]赋予初值,否则少胜者,发生段错误
{
max = W[temp];
sub[k] = temp;//最大的才可以晋级
}
}
k++;
}
for (i=0;i<k;i++)
p.push(sub[i]);
}
int main(){
scanf("%d %d\n",&NP,&NG);
int i,temp,W[NP],rank[NP];//rank存储最终需要输出的名次
for (i=0;i<NP;i++)
scanf("%d",&W[i]);
for (i=0;i<NP;i++)
{
scanf("%d",&temp);
p.push(temp);
}
while (p.size()!=1){
stage = p.size()/NG+(p.size()%NG!=0)+1;//晋级人数
Rank(W,rank);
}
//printf("%d %d\n",p.size(),p.front());
rank[p.front()] = 1;
for (i=0;i<NP;i++)
{
if (i!=0)
printf(" ");
printf("%d",rank[i]);
}
return 0;
}