

这一题的大意是说Np个老鼠参加比赛,相邻Ng个分成一组进行选拔,每组中选择最重的老鼠晋级,没有晋级的老鼠的排名一个样,按照这种思路给所有的老鼠进行排名,如果最后剩下不足Ng个仍可以分成一组,排名是跟分组个数相关。
这一题最开始我不理解的就是怎么确定排名,后来才明白,先算出当前的组数,然后排名等于组数+1,用测试样例验证是符合的。我们可以采用队列按照题目要求的顺序来保存老鼠的体重和索引,然后对一个个出队,在出队的过程中,我们找最大的体重和与之对应的索引,同时给老鼠排名,每Ng个我们把这Ng个中最重的老师,保存到一个新的队列中,这样遍历完一轮队列,就可以把所有的晋级的老师放入新的队列中,当当前队列为空之后,我们可以把新队列中的晋级的老鼠再赋值回去。循环往复即可。
完整代码如下:
cpp
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//每个老鼠的目标是尽可能的吃的多去成为一个胖老鼠// 玩的顺序是随机的对应Np个人来说
// 每NG个程序员组成一个队伍
// 最胖的老鼠进入下一个顺序
// 所由的失败者是相同的排名
// Ng个赢家再组成一个队伍去找最后的赢家
//给出体重和最初的排序
int Np;
int Ng;
struct node
{
int w;
int order;
}n[1005];
int ans[1005];
int order[1005];
bool flag;
queue<node> q;
int main()
{
cin>>Np>>Ng;
for(int i=0;i<Np;i++)
{
int x;
cin>>x;
n[i].w=x;
}
for(int i=0;i<Np;i++)
{
int x;
cin>>x;
order[i]=x;
n[x].order=x;
}
for(int i=0;i<Np;i++)
{
q.push(n[order[i]]);
}
int group;
if(Np%Ng==0)
{
group=Np/Ng;
}
else
{
group=Np/Ng+1;
}
int index=0;
int cnt=0;
int maxx=0;
// cout<<group<<endl;
queue<node> temp;
while(!q.empty())
{
node cur=q.front();
//cout<<cur.order<<endl;
q.pop();
ans[cur.order]=group+1;
cnt++;
if(cur.w>maxx)
{
maxx=cur.w;
index=cur.order;
}
if(cnt==Ng)
{
temp.push(n[index]);
cnt=0;
maxx=0;
index=0;
}
if(q.empty()&&cnt>0)
{
temp.push(n[index]);
cnt=0;
maxx=0;
index=0;
int groupnumber=temp.size();
if(groupnumber%Ng==0)
{
group=groupnumber/Ng;
}
else
{
group=groupnumber/Ng+1;
}
}
if(q.empty())
{
//说明刚好正分
q=temp;
int groupnumber=temp.size();
if(groupnumber%Ng==0)
{
group=groupnumber/Ng;
}
else
{
group=groupnumber/Ng+1;
}
while(!temp.empty())
{
temp.pop();
}
if(q.size()==1)
{
ans[q.front().order]=1;
break;
}
}
}
for(int i=0;i<Np;i++)
{
if(i==0)
{
cout<<ans[i];
}
else
{
cout<<" "<<ans[i];
}
}
return 0;
}
总结:这一题是队列模拟,只要弄清楚题意,按逻辑模拟即可