pat1056Mice and Rice (25)

56 篇文章 0 订阅

题意分析:

(1)给出一组数代表每个人的初始程序的“得分”,然后按照给出的一个任意排列的顺序,在这个排列中按照顺序每NG个人一组进行PK,每一组中最大的那个人PK胜出进入下一轮,剩余的人本轮淘汰,并且排名相同。不足NG人的小组按照一个小组计算

(2)相信绝大多数人都没有弄清楚这题到底是怎么得出最终的计算排名,原因在以下几个方面:

①那个排列就是出场的顺序,也就是每个人按自己的序号出场的顺序(6号第一个出场),并不是说第0号的人第6个出场。相信大多数人被坑在了这里

②其次就是如何通过晋级来确定本轮的名次,这个也是大多数人不理解的地方:其实并不需要确定了第一名之后才去确定第二名、第三名...因为每个小组都会晋级一人,几个小组就会晋级几个人,剩余的人排名肯定都是在这些人之后,那就好办了:M个小组内PK,M个人晋级,剩余的人排名就都是M+1.

(3)根据(2),因为每一轮都会有晋级,并且进入下一轮,因此可以使用队列来模拟这个过程,每组胜出者进入下一个队列中。

可能坑点:

(1)理解出场顺序出现了混淆

#include <iostream>
#include <queue>
#include <stdio.h>
using namespace std;

int main()
{
    int N,M;
    cin>>N>>M;
    const int num=N;
    int mouse[num];
    int rank[num];
    int i=0;
    while(i<num)
    {
        scanf("%d",mouse+i);
        i++;
    }
    queue<int> order;
    int t=0;
    int j=0;
    while(j<num)
    {
        cin>>t;
        order.push(t);
        j++;
    }
    while(order.size()!=1)
    {
        int gamecount=order.size()/M+(order.size()%M==0?0:1);
        int currentRank=gamecount+1;
        queue<int>temp;
        for(int i=0;i<gamecount;i++)
        {
            int max=-1;
            int maxindex=-1;
            for(int j=M*i;j<M*(i+1)&&order.size()!=0;j++)//如果不满m个的话,则需要判断一下选手的队列是否为空
            {
                int index=order.front();
                order.pop();
                if(mouse[index]>max)
                {
                    max=mouse[index];
                    rank[maxindex]=currentRank;
                    maxindex=index;
                }
                else
                {
                    rank[index]=currentRank;
                }
            }
            temp.push(maxindex);
        }
        order=temp;
    }
    rank[order.front()]=1;
    int first=1;
    for(int k=0;k<num;k++)
    {
        if(first)first=0;
        else cout<<" ";
        cout<<rank[k];
    }
    cout<<endl;
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值