【1056 25 队列应用】 Mice and Rice

传送门

题意

给定 \(n\) 个老鼠标号 \(0\sim n-1\)\(N_{G}\) 为每一组的最大数量,给定每个老鼠的权重 \(w_{i}\),游戏进行的序列 \(order\) ,根据 \(order\)\(ng\) 个为一组选出 \(1\) 个权重最大的进入下一轮,个数不够 \(ng\) 就剩余的为一组,最后按照标号输出排名,同一轮被淘汰的为同一排名

数据范围

\(N_{G}\leq 1000\)

题解

  • 队列进行模拟首先将所有的都放入队列
  • 通过模运算计算当前剩余人数能分到的组数每次都计算出最后一组的人数
    • 最后一组等于 \(q.size()%N_{G}\),总共组数为 \((q.size()-1)/N_{G}\)
    • 枚举所有组的情况,根据当前组数判断是否是最后一组来确定当前组的人数
    • 最后会选出 \(group\) 个人进入下一轮,所以当前淘汰的排名都为 \(group+1\)
    • 将最后剩余的最大权重的放入队列尾

Code

#include<bits/stdc++.h>
using namespace std;
struct node{
    int w,rk;
};
int main(){
    int n,ng; cin>>n>>ng;
    vector<node>a(n);
    queue<int>q;
    for(int i=0;i<n;i++) cin>>a[i].w;
    for(int i=0;i<n;i++) {
        int x; cin>>x;
        q.push(x);
    }
    while(q.size()>1){
        int ex=q.size()%ng==0?ng:q.size()%ng;
        int group=(q.size()-1)/ng;
        for(int i=0;i<group+1;i++){
            int cnt=i==group?ex:ng;
            int mx=q.front();
            for(int j=0;j<cnt;j++){
                a[q.front()].rk=group+2;
                if(a[q.front()].w>a[mx].w) mx=q.front();
                q.pop();
            }
            q.push(mx);
        }
    }
    a[q.front()].rk=1;
    for(int i=0;i<n;i++){
        if(i==0) cout<<a[i].rk;
        else cout<<' '<<a[i].rk;
    }
}
posted @ 2021-02-25 00:26  Hyx'  阅读(72)  评论(0)    收藏  举报