for the sake of simplicity:为了简单起见
permutation:排序
Np programmers:the number of programmers(程序员的数量)
Ng programmers:the maximum number of mice in a group(在一个分组中老鼠的最大数量——每个分组中的老鼠的数量,不够Ng的也被分为一组)
Ng< Np ,
Wi(i=0,...,Np-1):老鼠的重量
注意点:
1、老鼠的排名方法,自己想不通
mouse[front].rank = group + 1; //对该组老鼠进行排名,即使晋级的老鼠现在给予排名,后面会进行修改
2、题目中提到的初始顺序比较难理解,看完算法笔记才理解的
3、利用结构体来表达老鼠这个对象特征
解题思路:
1、这道题目读题目就让我费劲了心思,开始始终无法理解题意
2、这道题目在看懂题目后,手工解决能懂,但是对程序解决无从下手
3、在看了2遍《算法笔记》上的讲解后,才对题目大致的解题思路比较清楚了,第一遍还不知道代码的意思以及解题思路。
4、刚开始没理解到队列的特征,导致没理解思路,队列的先进先出,后进后出,在看完算法笔记上的讲解,体会到了队列对于此题目的便利性。
代码
#include<iostream>
#include<queue>
using namespace std;
//定义mouse结构体
struct Mouse{
int weight;//重量
int rank;//排名
}mouse[1001];
int main(){
int np, ng;
queue<int> q;
//输入老鼠的重量
scanf("%d %d", &np, &ng);
for (int i = 0; i < np; i++)
{
scanf("%d", &mouse[i].weight);
}
//输入初始老鼠们的序号
for (int i = 0; i < np; i++)
{
int order;
scanf("%d", &order);
q.push(order);
}
//进行比赛,每一轮while循环代表一轮比赛
int tempNp=np; //临时含有的老鼠数
int group; //要被分成的老鼠数
while (q.size()!=1)
{
//计算分组数
if (tempNp%ng==0)//如果组能被完整的分完
{
group = tempNp / ng;
}else//不能被分完
{
group = tempNp / ng + 1;
}
for (int i = 0; i < group; i++)//对group个ng组分别进行排名
{
int k = q.front();//k为每一个ng的组中最大重量的老鼠对应的组号,初始值假定为q.front()
for (int j = 0; j < ng; j++)//找最大重量
{
//判断该循环的元素个数是否已经超过了tempNp的值
if (i*ng+j>=tempNp)
{
break;
}
int front = q.front();//当前队列的首元素
if (mouse[front].weight>mouse[k].weight)
{
k = front;
}
mouse[front].rank = group + 1; //对该组老鼠进行排名,即使晋级的老鼠现在给予排名,后面会进行修改
q.pop();
}
q.push(k);//将每一个ng组中的最大重量的老鼠的序号压如
}
tempNp = group;//晋级的老鼠数就等于该论比赛group的组数
}
//对最后胜出的小鼠进行排名
mouse[q.front()].rank = 1;
//输出
for (int i = 0; i < np; i++)
{
printf("%d", mouse[i].rank);
if (i<np-1)
{
printf(" ");
}
}
system("pause");
return 0;
}