1056. Mice and Rice (25)

题意比较晦涩,英文不大好,上网查的分析如下:

 1)input中的第三行是索引,表示的是以第三行索引的顺序进行比较,也就是说第6、0、8个mice先组成一组进行比较,而这3个mice吃到的rice就是 第二行中对应的值19、25、57,因此第8个mice吃到的是57数量最多晋级,同理第7、10、5个mice吃到的rice是22、10、3,第7个晋级,第 9、1、4个mice吃到的rice是56、18、37,第9个晋级,剩下的只有第2、3个mice,分别吃到的rice是0、46,第3个晋级,于是第8、7、9、3一 共4个mice晋级到下一轮,并继续按照这个顺序比较,那么其他没有晋级的mice的排名都是第5名。

2)第8、7、9、3个mice吃到的rice分别是57、22、56、46,前三个中第8个晋级,剩下的第3个也晋级,所以未晋级的7、9的排名都是第3。
3)第8、3个mice的排名分别是第1和第2了。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;

//1056
int p,g,r;
vector<int> w,o,rk;
int main()
{
   // freopen("input.txt","r",stdin);
    cin>>p>>g;
    w.resize(p),o.resize(p),rk.resize(p);
    for(int i=0;i<p;i++)    cin>>w[i];
    for(int i=0;i<p;i++)    cin>>o[i];
    while(o.size()>1)
    {
        r=o.size()/g+1;
        if(o.size()%g)  r++;
        vector<int> tmp;
        tmp.clear();
        int n=0;
        while(n<o.size())   //内层循环一遍,找到晋级下一轮的数的位置
        {
            int mx=-1,idx=0;
            for(int i=0;i<g && n<o.size();++i,++n)
            {
                rk[o[n]]=r;
                if(w[o[n]]>mx)
                    mx=w[o[n]],idx=o[n];
            }
            tmp.push_back(idx);
        }
        o=tmp;
    }
    rk[o[0]]=1;
    cout<<rk[0];
    for(int i=1;i<p;i++)
        cout<<" "<<rk[i];
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值