PAT甲题题解-1056. Mice and Rice (25)-模拟题

有n个老鼠,第一行给出n个老鼠的重量,第二行给出他们的顺序。
1.每一轮分成若干组,每组m个老鼠,不能整除的多余的作为最后一组。
2.每组重量最大的进入下一轮。
让你给出每只老鼠最后的排名。
很简单,用两个数组模拟一下即可
order1存储进入当前一轮老鼠的索引顺序
order2存储进入下一轮老鼠的索引顺序

如果当前有groups个组,那么会有groups个老鼠进入下一轮,则没有进入下一轮的排名都为groups+1
如果只有一个组,那么最大的那个排名即为1。

 

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>

using namespace std;
const int maxn=1000+5;

struct Mice{
    int weight;
    int ranks;
}mice[maxn];

int order1[maxn];
int cnt1=0;
int order2[maxn];
int cnt2=0;
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&mice[i].weight);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&order1[i]);
    }
    cnt1=n;
    int rRanks=0;
    int groups;
    while(1){
        rRanks++;
        cnt2=0;
        int maxw,maxid;
        groups=cnt1/m;
        if(cnt1%m!=0)
            groups++;
        for(int i=0;i<cnt1;i+=m){
            maxw=0;
            int v;
            for(int j=i;j<i+m&&j<cnt1;j++){
               v=order1[j];
                if(mice[v].weight>maxw){
                    maxw=mice[v].weight;
                    maxid=v;
                }
            }
            for(int j=i;j<i+m&&j<cnt1;j++){
                v=order1[j];
                if(v!=maxid)
                    mice[v].ranks=groups+1;//有groups个组,那么晋级下一轮的就有groups个人,所有没晋级的并列第groups+1名。
            }
            order2[cnt2++]=maxid;
        }
        if(cnt1<=m){
            mice[maxid].ranks=1;
            break;
        }
        for(int i=0;i<cnt2;i++){
            order1[i]=order2[i];
        }
        cnt1=cnt2;
    }
    printf("%d",mice[0].ranks);
    for(int i=1;i<n;i++){
        printf(" %d",mice[i].ranks);
    }
    return 0;
}
View Code

 

posted @ 2017-03-08 16:06  辰曦~文若  阅读(1412)  评论(0编辑  收藏  举报