这里需要做一点说明,最开始我没有考虑再设一个mark来进行记录,这样在入队的时候顺序自然就发生了改变,那么就无法以给定顺序做进一步的分组。
分组的时候考虑的是给定序列的问题(第三行)
而输出的时候考虑的是输出重量的顺序(第二行)
同时在考虑到多变量结构体的问题时,类似这样的问题不妨多设变量来实现程序的较好的可读性。
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
int rank;
int weight;
int id;
int mark;
};
bool cmp(node a,node b)
{
return a.id<b.id;
}
int main()
{
int n,ng,id;
cin>>n>>ng;
vector<node> ans(n);
vector<int> w(n);
for (int i=0;i<n;i++)
{
scanf("%d",&w[i]);
}
for (int i=0;i<n;i++)
{
scanf("%d",&id);
ans[i].id=id;
ans[i].weight=w[id];
ans[i].mark=i;
}
queue<node>q;
for (int i=0;i<n;i++)
{
q.push(ans[i]);
}
while(!q.empty())
{
int size=q.size();
if(size==1)
{
node temp=q.front();
ans[temp.mark].rank=1;
break;
}
int group;
if(size%ng==0)
{
group=size/ng;
}
else
{
group=size/ng+1;
}
int maxn=-1,cnt=0;
for(int i=0;i<size;i++)
{
node temp=q.front();
node maxnode;
q.pop();
ans[temp.mark].rank=group+1;
if(temp.weight>maxn)
{
maxnode=temp;
maxn=temp.weight;
}
cnt++;
if(cnt==ng||i==size-1)
{
q.push(maxnode);
cnt=0;
maxn=-1;
}
}
}
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<n;i++)
{
printf("%d",ans[i].rank);
if(i!=n-1)
printf(" ");
}
}