*PAT_甲级_1056 Mice and Rice (25分) (C++)【模拟/队列的应用】

目录

1,题目描述

题目大意

输入

输出

2,思路

数据结构

算法

3,代码

4,运行结果


1,题目描述

(这一题是真的迷,看了N遍,硬生生没看懂什么意思。。。)

 

Sample Input:

11 3
25 18 0 46 37 3 19 22 57 56 10
6 0 8 7 10 5 9 1 4 2 3

 

Sample Output:

5 5 5 2 5 5 5 3 1 3 5

题目大意

(按照体重和运气给所有的mice排名。也就是说排名靠前的,不一定是最重的,也可能是比赛那一组里的其他对手太弱。)

按0 - N-1的顺序给出每只老鼠的重量。然后给出每只老鼠的出场顺序,每Ng只老鼠分为一组,选出最重的。第一轮中的winner抽出来,进行第二轮……直到选出第一名。

按照编号顺序输出每只老鼠的排名。

(虽然很绕,但确实更接近生活中的例子)

输入

  • 第一行:Np参赛人数,Ng每组的人数;
  • 第二行:编号从0到Np-1的参赛选手的重量;
  • 第三行:参赛人员的出场顺序;

输出

  1. 按编号输出每位参赛选手的排名; 

 

2,思路

(这一题参考了柳神的做法。膜拜!!!)

数据结构

  • struct node{int weight, id, order, rank;}:weight重量 ,id编号, order出场顺序, rank排名;
  • vector<node> data(Np):存放所有参赛选手的信息(包括编号和出场顺序);
  • queue<node> q:用队列模拟比赛流程,按照出场顺序存放选手的信息,并在每个选手出队时,填充排名字段;

算法

  1.  将所有的选手信息按照出场顺序入队;
  2. 每出队一名选手(淘汰),该选手的排名便已经确定(为group+1,比如,当前轮次有四组,则每一组选出一名优胜者,一共四名,按照非递增排序,这一轮淘汰的选手排名均为4+1);
  3. 选出的优胜者重新进入队列的尾部,继续进行下一轮的筛选;
  4. 当队列中只有一名选手时,他就是冠军!结束队列的循环;
  5. 再将选手按照编号重新排序,输出每个选手的排名;

 

3,代码

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;

int flag;
struct node{
    int weight, id, order, rank;            //weight重量 id编号 order顺序 rank排名
};
bool cmp1(node a, node b){
    if(flag == 1)
        return a.order < b.order;
    else if(flag == 2)
        return a.id < b.id;
}
int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE

    int Np, Ng;                             //Np参赛老鼠数目 Ng每组包含老鼠数目
    cin>>Np>>Ng;

    vector<node> data(Np);                  //按编号顺序存放每只老鼠的体重
    queue<node> q;
    int w;
    for(int i = 0; i < Np; i++){
        scanf("%d", &w);
        data[i].weight = w;
        data[i].id = i;
    }
    for(int i = 0; i < Np; i++){
        scanf("%d", &w);
        data[w].order = i;
    }

    flag = 1;
    sort(data.begin(), data.end(), cmp1);   //按照出场顺序排序
    for(int i = 0; i < Np; i++)
        q.push(data[i]);

    while(!q.empty()){                      //每出队一个元素 可以确定他的排名
        int curNum = q.size();              //curNum为这一轮的参赛队员人数
        if(q.size() == 1){                  //冠军诞生
            data[q.front().order].rank = 1;
            break;
        }

        int group = q.size() / Ng;          //求出当前的队员数目可以组成的队伍数
        if(q.size() % Ng != 0) group++;
        for(int g = 0; g < group; g++){     //每组选出冠军 重新进入队列尾部
            node maxNode, temp;
            maxNode.weight = -1;
            for(int i = 0; i < Ng && curNum > 0; i++){
                temp = q.front();
                data[temp.order].rank = group + 1;  //group+1即为此轮淘汰的选手的名次
                q.pop();
                curNum--;
                if(temp.weight > maxNode.weight)
                    maxNode = temp;
            }
            q.push(maxNode);
            maxNode.weight = -1;
        }
    }
    flag = 2;
    sort(data.begin(), data.end(), cmp1);   //按照编号重新排序
    printf("%d", data[0].rank);
    for(int i = 1; i < Np; i++)
        printf(" %d", data[i].rank);
}

4,运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值