PAT 1056 Mice and Rice

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值