PTA甲级-1056

队列模拟

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <stdio.h>
using namespace std;
int num;
int group;

struct Mouse
{
    int weight;
    int ranks;
    int order;
    Mouse(){};
    Mouse(int w)
    {
        weight=w;
        ranks=0;
        order=0;
    }
};

bool cmp(Mouse a,Mouse b)
{
    return a.weight>b.weight;
}

int main()
{
    //freopen("D:/test.txt","r",stdin);
    cin>>num>>group;
    int i=num;
    int weig, ord;
    vector<Mouse> ans;
    vector<int> orde;
    queue<Mouse> comp;
    while(i)
    {
        cin>>weig;
        Mouse m = Mouse(weig);
        ans.push_back(m);
        i--;
    }
    i=0;
    while(i!=num)
    {
        cin>>ord;
        ans[ord].order=i;
        orde.push_back(ord);
        i++;
    }

    for(i=0; i<num; i++)
    {
        comp.push(ans[orde[i]]);
    }
    int nug=num/group;
    int lef=num%group;
    int maxRank=0;
    if(group==1){
        vector<Mouse> a;
        for(i=0;i<num;i++){
            a.push_back(ans[i]);
        }
        sort(a.begin(),a.end(),cmp);
        for(i=0;i<num;i++){
            a[i].ranks=i+1;
        }
        for(i=0;i<num;i++){
            for(int j=0;j<num;j++){
                if(ans[i].order==a[j].order){
                    cout<<a[j].ranks;
                    if(i!=num-1){
                        cout<<" ";
                    }
                }
            }
        }
        return 0;
    }
    while(1)
    {
        int cnt=0;
        Mouse m = Mouse();
        for(i=0; i<nug; i++)
        {
            m=comp.front();
            comp.pop();
            if(comp.empty()){
                break;
            }
            for(int j=1; j<group; j++)
            {
                if(m.weight<comp.front().weight)
                    m=comp.front();
                comp.pop();

            }
            m.ranks++;
            maxRank=m.ranks;
            for(int k=0;k<num;k++){
                if(ans[k].order==m.order){
                    ans[k].ranks=m.ranks;
                    break;
                }
            }
            comp.push(m);
            cnt++;
        }
        if(lef>0)
        {
            m=comp.front();
            comp.pop();
            if(comp.empty()){
                break;
            }
            for(i=1; i<lef; i++)
            {
                if(m.weight<comp.front().weight)
                    m=comp.front();
                comp.pop();
            }
            m.ranks++;
            maxRank=m.ranks;
            for(int k=0;k<num;k++){
                if(ans[k].order==m.order){
                    ans[k].ranks=m.ranks;
                    break;
                }
            }
            comp.push(m);
            cnt++;
        }
        nug=cnt/group;
        lef=cnt%group;
    }

    maxRank++;
    int ran=0;
    for(i=0;i<num;i++){
        ans[i].ranks=maxRank-ans[i].ranks;
    }
    vector<int> ranknum;
    for(int r=1;r<maxRank;r++){
        for(i=0;i<num;i++){
            if(ans[i].ranks==r){
                ran++;
            }
        }
        ranknum.push_back(ran);
    }
    for(int r=maxRank;r>1;r--){
        for(i=0;i<num;i++){
            if(ans[i].ranks==r){
                ans[i].ranks=ranknum[r-2]+1;
            }
        }
    }
    cout<<ans[0].ranks;
    for(i=1;i<num;i++){
        cout<<" "<<ans[i].ranks;
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值