PAT 甲级 1056

题目的排序没读懂,后面看参考书才知道老鼠体重的排序是从1开始排,可以并列第3,所以其他老鼠的体重都是5而不是4......(一开始我以为他1,2,3,5的排序是最后一名要+1......导致只过了一半的测试点QAQ)

数组(vector) v[i]代表第i只老鼠的体重,num[i]代表第i只老鼠的排名(1最小,出循环的high最大),因为最后输出的第一名体重最大,所以把num[i]转换成turn[num[i]],转换方式如下:

  1. turn[num[i]]++计算不同高度(排名从1开始,1最小)各有几只老鼠
  2. turn[i]+=turn[i-1]计算排名>=i的有几只老鼠
  3. np-turn[num[i]]+1输出正确的排名,例如有一只老鼠num[i]=1,那么turn[num[i]]就是排名为1的老鼠的只数,np-turn[num[i]]+1就是他们需要的正确排名。(说的好混乱QAQ容我好好捋一捋......)
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
    int np,ng,temp,maxn,high=1;
    cin>>np>>ng;
    vector<int> v(np),num(np),turn(np);
    queue<int> q;
    for(int i=0;i<np;i++)cin>>v[i];
    for(int i=0;i<np;i++){
        cin>>temp;
        q.push(temp);
        num[i]=0;
        turn[i]=0;
    }
    int n=np;
    while (n){
        int i=1,max=-1;
        for(;i<=n;i++){
            if (v[q.front()]>max){
                max=v[q.front()];
                maxn=q.front();
            }
            q.pop();
            if (i%ng==0){
                max=-1;
                q.push(maxn);
                num[maxn]=high;
            }
        }
        if ((i-1)%ng!=0){
            q.push(maxn);
            num[maxn]=high;
        }
        n=(n+ng-1)/ng;
        if(n==1)break;
        high++;
    }
    for(int i=0;i<np;i++)turn[num[i]]++;
    for(int i=1;i<np;i++)turn[i]+=turn[i-1];
    for(int i=0;i<np;i++){
        if(i!=0)cout<<" ";
        cout<<np-turn[num[i]]+1;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值