1056. Mice and Rice (25)

1056. Mice and Rice (25)

#include <stdio.h>
#include <malloc.h>
int FindMaxi(int record[],int a[],int begin,int end)
{
    int max=record[a[begin]],i=a[begin];
    while(begin<end)
    {
        if(record[a[begin]]>max)
        {
            max=record[a[begin]];
            i=a[begin];
        }
        ++begin;
    }
    return i;
}
int main()
{
    int n,m,i,record[1001],rank[1001];
    scanf("%d %d",&n,&m);
    int *a=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;++i)
        scanf("%d",&record[i]);
    for(i=0;i<n;++i)
        scanf("%d",&a[i]);
    int curscale=n,nextscale;
    while(curscale>1)
    {
        if(curscale%m)
            nextscale=curscale/m+1;
        else
            nextscale=curscale/m;
        int begin=0,end,j=0,*ta=(int*)malloc(nextscale*sizeof(int));
        while(begin<curscale)
        {
            if(curscale-begin>=m)
                end=begin+m;
            else
                end=curscale;
            i=FindMaxi(record,a,begin,end);
            ta[j++]=i;
            int k;
            for(k=begin;k<end;++k)
                if(a[k]!=i)rank[a[k]]=nextscale+1;
            begin=end;
        }
        free(a);
        a=ta;
        curscale=nextscale;
    }
    rank[a[0]]=1;
    for(i=0;i<n;++i)
    {
        printf("%d",rank[i]);
        if(i!=n-1)printf(" ");
    }
    return 0;
}

转载于:https://www.cnblogs.com/xLester/p/7570436.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值