题目大意:
Np只老鼠,每Ng只分为一组选出体重最大的进入下一轮,最后不够Ng也组成一组。直到选出第一名。输出每只老鼠的排名。
解题思路:
老鼠分组指令可以用队列保存,我用了两个队列互相转换。一开始死活没想出来排名怎么得到,后来一看排名是分组数+1。emmm,还是没想明白为什么啊。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
struct mice
{
int weight;
int rank;
}m[1100];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
int n,g;
cin>>n>>g;
for(int i=0;i<n;i++)cin>>m[i].weight;
queue<int> q1,q2;//存放每轮的参赛鼠
for(int i=0;i<n;i++)
{
int t;
cin>>t;
q1.push(t);
}
while((q1.size()+q2.size())!=1)//决出最后一名前
{
if(!q2.empty())
{
int rank=q2.size()/g;
if(q2.size()%g)rank++;
rank++;//本轮排名(组数+1)
while(!q2.empty())
{
int cur,count=0,k=-1;
while(count!=g&&!q2.empty())
{
if(m[q2.front()].weight>k)//更新最大值
{
k=m[q2.front()].weight;
cur=q2.front();
}
m[q2.front()].rank=rank;
q2.pop();
count++;
}
q1.push(cur);//获胜者入队
}
}
if(!q1.empty())//同理
{
int rank=q1.size()/g;
if(q1.size()%g)rank++;
rank++;
while(!q1.empty())
{
int cur=0,count=0,k=-1;
while(count!=g&&!q1.empty())
{
if(m[q1.front()].weight>k)
{
k=m[q1.front()].weight;
cur=q1.front();
}
m[q1.front()].rank=rank;
q1.pop();
count++;
}
q2.push(cur);
}
}
}
if(!q1.empty())m[q1.front()].rank=1;//找到第一名
else m[q2.front()].rank=1;
cout<<m[0].rank;
for(int i=1;i<n;i++)cout<<' '<<m[i].rank;
cout<<endl;
// std::ios::sync_with_stdio(false);
// cin.tie(0);
// freopen("test.txt","r",stdin);
// freopen("output.txt","w",stdout);
return 0;
}