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 N​P​​ programmers. Then every N​G​​ 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 N​G​​ 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: N​P​​ and N​G​​ (≤1000), the number of programmers and the maximum number of mice in a group, respectively. If there are less than N​G​​ 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 N​P​​ distinct non-negative numbers W​i​​ (i=0,⋯,N​P​​−1) where each W​i​​ is the weight of the i-th mouse respectively. The third line gives the initial playing order which is a permutation of 0,⋯,N​P​​−1 (assume that the programmers are numbered from 0 to N​P​​−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

题目大意

题目给定一组游戏结果,参与游戏的顺序是随机决定的,规则为将若干个游戏结果分组进行匹配。最大的数字获胜并进入下一轮,其余人被淘汰,所有的被淘汰者的排名一致,直到确定最后的获胜者。题目给定游戏数据和初始游戏顺序,要求输出其排名。

解题思路

  1. 读入题目所给数据并用结构体存储,并记录游戏顺序;
  2. 用vector容器模拟队列,并按照题目要求选取最大值,同时记录排名;
  3. 边界条件是队列内仅剩一个数据,则排名为1,退出循环;
  4. 输出结果并返回零值。

代码

#include<cstdio>
#include<vector>
#define maxn 1010
using namespace std;
 
struct mouse{
    int weight;
    int rank;
}mice[maxn]; 

int main(){
    int NP,NG;
    int Rat,Group;
    int i,j,k,front,current,u,max;
    vector<int> Seq,temp;
    scanf("%d%d",&NP,&NG);
    for(i=0;i<NP;i++){
        scanf("%d",&mice[i].weight);
    }
    for(i=0;i<NP;i++){
        scanf("%d",&j);
        Seq.push_back(j);
    }
    Rat=NP;
    while(1){
        Group=(Rat+NG-1)/NG;//组数
        front=0;
        temp.clear();
        for(i=0;i<Group;i++){
            u=-1,max=-1;
            for(j=0;j<NG;j++){
                current=Seq[front++];
                mice[current].rank=Group+1;
                if(mice[current].weight>max){
                    max=mice[current].weight;
                    u=current;
                }
                if(front==Rat){
                    break;
                }
            }
            temp.push_back(u);
        }
        Rat=Group;
        Seq=temp;
        if(Rat==1){
            mice[Seq[0]].rank=1;
            break;
        }
    }
    for(i=0;i<NP;i++){
        printf("%d",mice[i].rank);
        if(i<NP-1){
            printf(" ");
        }else{
            printf("\n");
        }
    }
    return 0;
}

运行结果

PAT-A1056 Mice and Rice 题目内容及题解

 

相关文章:

  • 2021-11-18
  • 2021-06-12
  • 2022-12-23
  • 2022-01-12
  • 2021-05-11
  • 2021-07-02
  • 2021-04-25
  • 2022-01-07
猜你喜欢
  • 2021-11-17
  • 2022-12-23
  • 2022-12-23
  • 2021-06-09
  • 2021-11-08
  • 2021-07-31
  • 2021-09-09
相关资源
相似解决方案