题目的排序没读懂,后面看参考书才知道老鼠体重的排序是从1开始排,可以并列第3,所以其他老鼠的体重都是5而不是4......(一开始我以为他1,2,3,5的排序是最后一名要+1......导致只过了一半的测试点QAQ)
数组(vector) v[i]代表第i只老鼠的体重,num[i]代表第i只老鼠的排名(1最小,出循环的high最大),因为最后输出的第一名体重最大,所以把num[i]转换成turn[num[i]],转换方式如下:
- turn[num[i]]++计算不同高度(排名从1开始,1最小)各有几只老鼠
- turn[i]+=turn[i-1]计算排名>=i的有几只老鼠
- 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;
}