本文介绍: 坑点:每个选手rank为该轮竞赛选出的优胜者数+1!而不应该根据该选手是在第几轮淘汰算的!因为肯定比优胜者rank低嘛。思路:可以队列模拟选手顺序,每次取出组数个选手(不足则全部取出),然后将优胜者放入下一轮队列中,淘汰者记录下来,最后将淘汰者的rank标记为优胜者数+1。题意:给定一组选手,按一定顺序将这些选手进行分组竞赛,每组的最大值为优胜者,进入下一轮分组再进行竞赛,直到选出最大值然后输出每个选手的rank。(成功浪费两小时寿命,坑比模拟题,真的心累)

(成功浪费两小时寿命,坑比模拟题,真的心累)

题意:给定一组选手,按一定顺序将这些选手进行分组竞赛,每组的最大值为优胜者,进入下一轮分组再进行竞赛,直到选出最大值然后输出每个选手的rank

坑点:每个选手的rank为该轮竞赛选出的优胜者数+1!!而不应该根据该选手是在第几轮淘汰算的!因为肯定比优胜者的rank低嘛。我阅读理解确实不太好,于是成功浪费两小时。

思路:可以队列模拟选手顺序,每次取出组数个选手(不足则全部取出),然后将优胜者放入下一轮队列中,淘汰者记录下来,最后将淘汰者的rank标记为优胜者数+1。

#include<bits/stdc++.h>
using namespace std;

struct node{
    int val;
    int rank;
};
node p[1010];
queue<int>q;
int n,m;
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>p[i].val;
    }
    for(int i=0;i<n;i++){
        int a;cin>>a;
        q.push(a);
    }
    while(q.size()>1){
        queue<int>next;
        queue<int>loser;
        while(q.size()){
            int k=min(m,(int)q.size());
            vector<int>temp;
            while(k--){
                int f=q.front();q.pop();
                temp.push_back(f);
            }
            int mx=-1,pos;
            for(auto x:temp){
                if(mx<p[x].val){
                    mx=p[x].val;
                    pos=x;
                }
            }
            for(auto x:temp){
                if(x!=pos){
                    loser.push(x);
                }
            }
            next.push(pos);
            // cout<<pos<<' ';
        }
        while(loser.size()){
            int f=loser.front();loser.pop();
            p[f].rank=next.size()+1;
        }
        q=next;
    }
    p[q.front()].rank=1;
    int flag=0;
    for(int i=0;i<n;i++){
        if(flag)cout<<' ';
        cout<<p[i].rank;flag=1;
    }
}

原文地址:https://blog.csdn.net/qq_63128300/article/details/134628362

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_13399.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注