0
点赞
收藏
分享

微信扫一扫

C++PAT A1056分组排名(queue或vector)

是她丫 2022-01-25 阅读 14
c++

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 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 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

核心思想

这道题目的难度在于你的算法及选择的容器,第一你要完全模拟分组比赛,第二你要给他们排名。这里选择数组作为存储容器,第一个数组存储他的体重,Ng存储他的分组数,

完整代码



#include<iostream>
#include<vector>
using namespace std;

int Np,Ng;
vector<int>players;

int main()
{
    //freopen("C:\\Users\\Administrator\\Desktop\\test\\input.txt","r",stdin);
    int i,j,k,l,score[1000],Rank[1000];
    cin >> Np >> Ng;
    for(i=0;i<Np;i++) cin >> score[i];
    for(i=0;i<Np;i++){
        cin >> j;
        players.emplace_back(j);
    }
    for(int num = Np;num>1;){
        vector<int>nextturn;
        for(i=0;i<num;i+=Ng){
            int jinji = i;
            for(j = i+1;j<i+Ng&&j<num;j++){
                if(score[players[j]]>score[players[jinji]]){
                    jinji = j;
                }
            }
            nextturn.emplace_back(players[jinji]);
            for(j=i;j<i+Ng&&j<num;j++){
                if(j!=jinji){
                    Rank[players[j]] = num/Ng+(num%Ng?1:0)+1;
                }
            }
        }
        players = nextturn;
        num = num/Ng+(num%Ng?1:0);
    }
    Rank[players[0]] = 1;
    for(i=0;i<Np;i++){
        if(i) cout << " ";
        cout << Rank[i];
    }
    return 0;
}

方法2利用队列做

#include<cstdio>
#include<stack>
#include<queue>
using namespace std;
const int maxn = 1010;
struct mouse{ //老鼠
    int weight;//质量
    int R;//排名
}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 tmp = np,group; //temp为当前轮的比赛老鼠数,group为组数
    while(q.size()!=1){
        //计算group,即当前轮分为几组进行比赛
        if(tmp%ng==0) group = tmp/ng;
        else group = tmp/ng+1;
        //枚举每一组,选出该组老鼠中质量最大的
        for(int i =0;i<group;i++){
            int k = q.front();//k存储该组质量最大的老鼠编号
            for(int j =0;j<ng;j++){
                //在最后一组老鼠数不足Ng起作用,退出循环
                if(i*ng+j>=tmp) break;
                int front = q.front();//队首老鼠编号
                if(mouse[front].weight>mouse[k].weight){
                    k = front;
                }
                mouse[front].R = group+1;
                q.pop();
            }
            q.push(k);//把胜利1的老鼠晋级
        }
        tmp = group; // group 只老鼠晋级,因此下轮棕老师为group
    }
    mouse[q.front()].R = 1;
    for(int i = 0;i<np;i++){
        printf("%d",mouse[i].R);
        if(i<np-1) printf(" ");
    }
    return 0;
}
举报

相关推荐

0 条评论