题意分析:
(1)给出一组数代表每个人的初始程序的“得分”,然后按照给出的一个任意排列的顺序,在这个排列中按照顺序每NG个人一组进行PK,每一组中最大的那个人PK胜出进入下一轮,剩余的人本轮淘汰,并且排名相同。不足NG人的小组按照一个小组计算
(2)相信绝大多数人都没有弄清楚这题到底是怎么得出最终的计算排名,原因在以下几个方面:
①那个排列就是出场的顺序,也就是每个人按自己的序号出场的顺序(6号第一个出场),并不是说第0号的人第6个出场。相信大多数人被坑在了这里
②其次就是如何通过晋级来确定本轮的名次,这个也是大多数人不理解的地方:其实并不需要确定了第一名之后才去确定第二名、第三名...因为每个小组都会晋级一人,几个小组就会晋级几个人,剩余的人排名肯定都是在这些人之后,那就好办了:M个小组内PK,M个人晋级,剩余的人排名就都是M+1.
(3)根据(2),因为每一轮都会有晋级,并且进入下一轮,因此可以使用队列来模拟这个过程,每组胜出者进入下一个队列中。
可能坑点:
(1)理解出场顺序出现了混淆
#include <iostream>
#include <queue>
#include <stdio.h>
using namespace std;
int main()
{
int N,M;
cin>>N>>M;
const int num=N;
int mouse[num];
int rank[num];
int i=0;
while(i<num)
{
scanf("%d",mouse+i);
i++;
}
queue<int> order;
int t=0;
int j=0;
while(j<num)
{
cin>>t;
order.push(t);
j++;
}
while(order.size()!=1)
{
int gamecount=order.size()/M+(order.size()%M==0?0:1);
int currentRank=gamecount+1;
queue<int>temp;
for(int i=0;i<gamecount;i++)
{
int max=-1;
int maxindex=-1;
for(int j=M*i;j<M*(i+1)&&order.size()!=0;j++)//如果不满m个的话,则需要判断一下选手的队列是否为空
{
int index=order.front();
order.pop();
if(mouse[index]>max)
{
max=mouse[index];
rank[maxindex]=currentRank;
maxindex=index;
}
else
{
rank[index]=currentRank;
}
}
temp.push(maxindex);
}
order=temp;
}
rank[order.front()]=1;
int first=1;
for(int k=0;k<num;k++)
{
if(first)first=0;
else cout<<" ";
cout<<rank[k];
}
cout<<endl;
return 0;
}