题目介绍

  • 题目链接

    https://pintia.cn/problem-sets/994805342720868352/problems/994805419468242944

  • 题目考点

    队列、模拟。重点在模拟,队列只用到了建立、入队、出队、清空(需要自己实现,创建新的队列然后赋值或者swap)。

  • 题目难度

    PAT甲级25分

  • 题目大意

    • 给定1个图,每个玩家控制1只老鼠移动,每个老鼠的目标是尽可能多地吃大米变成Fat Mouse。
    • \(N_P\)个玩家的顺序是随机的,每\(N_G\)个玩家分成1组进行比赛。每轮的获胜者继续每\(N_G\)个玩家分成一组进行比赛,直到最后1只老鼠。
    • 每组中最快的老鼠获胜并进入下一轮,一轮中失败的老鼠的rank(排名)相同。
    • 假设每只老鼠的重量是固定的,给出所有大米的重量和玩家初始顺序,请输出每个玩家的rank。
  • 输入

    • \(N_P\):玩家的数量,正整数,不超过1000
    • \(N_G\):每组中最多有几个玩家(如果剩下的老鼠不够\(N_G\)只,这几只就形成最后一组),正整数,不超过1000
    • \(W_i\):\(N_P\)个老鼠的重量,互异的非负数
    • \(N_P\)个玩家的顺序,玩家索引为\([0,N_P-1]\)
  • 输出

    • 按玩家索引顺序最终所有玩家的rank

题解

解题思路

  • 两个队列:一个保存本轮玩家,一个保存下轮玩家,一直循环到结束(队列里只有1个人)。

  • 关于rank,起初我的想法是通过比赛轮数得到rank,然而发现不行,因为rank要看人数,而不是由在几轮失败决定。

    怎么算rank我也想了挺久,后来看了题解才知道:5个人比赛,2个人晋级,那这失败的3个人的rank就是3(即2+1)妙啊。

  • 除了rank,其它部分就比较简单了。

代码

// Problem: PAT Advanced 1056
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805419468242944
// Tags: #include <iostream>
#include <queue>
using namespace std; int playerNum, playerMaxNumInAGroup; // 玩家数量,1组最多多少玩家
queue<int> nowPlayers, nextPlayers; // 本轮玩家的索引和下轮玩家的索引
int weight[1002]; // 老鼠的重量
int rrank[1002]; // 玩家的排名
int groupNum; // 本轮比赛有多少组 /*一组玩家进行比赛*/
int findFatMouse(){
int maxWeight = weight[nowPlayers.front()], fatMouse = nowPlayers.front();
rrank[nowPlayers.front()] = groupNum + 1;
nowPlayers.pop(); for (int i=1; i < playerMaxNumInAGroup && !nowPlayers.empty(); i++){
if (weight[nowPlayers.front()] > maxWeight){
maxWeight = weight[nowPlayers.front()];
fatMouse = nowPlayers.front();
}
rrank[nowPlayers.front()] = groupNum + 1;
nowPlayers.pop();
}
nextPlayers.push(fatMouse);
} /*计算本轮比赛有几组*/
int calcGroupNum(){
int nowPlayerNum = nowPlayers.size();
if (nowPlayerNum % playerMaxNumInAGroup == 0)
return nowPlayerNum / playerMaxNumInAGroup;
else
return nowPlayerNum / playerMaxNumInAGroup + 1;
} int main()
{
// 读取变量
scanf("%d%d", &playerNum, &playerMaxNumInAGroup);
for(int i=0; i < playerNum; i++)
scanf("%d", weight+i);
for(int i=0, player; i < playerNum; i++){
scanf("%d", &player);
nowPlayers.push(player);
} // 进行比赛
while(nowPlayers.size() > 1){
nextPlayers = queue<int>(); // 清空下一轮比赛的玩家队列
groupNum = calcGroupNum(); // 计算本轮比赛有几组,本轮失败的玩家的rank即为groupNum + 1
for (int i = 0; i < groupNum; i++) // 进行本轮的groupNum组比赛
findFatMouse(); // 一组玩家进行比赛
nowPlayers = nextPlayers; // 进行下一轮比赛,更新玩家队列
}
rrank[nowPlayers.front()] = 1; // 剩下的1个人就是最终的第1名 // 输出排名
printf("%d", rrank[0]);
for (int i = 1; i < playerNum; i++)
printf(" %d", rrank[i]);
return 0;
}

参考链接


Github(github.com):@chouxianyu

Github Pages(github.io):@臭咸鱼

知乎(zhihu.com):@臭咸鱼

博客园(cnblogs.com):@臭咸鱼

B站(bilibili.com):@绝版臭咸鱼

微信公众号:@臭咸鱼的快乐生活

转载请注明出处,欢迎讨论和交流!


PAT甲级1056Mice and Rice的更多相关文章

  1. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. PAT甲级题分类汇编——排序

    本文为PAT甲级分类汇编系列文章. 排序题,就是以排序算法为主的题.纯排序,用 std::sort 就能解决的那种,20分都算不上,只能放在乙级,甲级的排序题要么是排序的规则复杂,要么是排完序还要做点 ...

  3. PAT甲级题分类汇编——序言

    今天开个坑,分类整理PAT甲级题目(https://pintia.cn/problem-sets/994805342720868352/problems/type/7)中1051~1100部分.语言是 ...

  4. PAT甲级1131. Subway Map

    PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...

  5. PAT甲级1127. ZigZagging on a Tree

    PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...

  6. PAT甲级1123. Is It a Complete AVL Tree

    PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...

  7. PAT甲级1119. Pre- and Post-order Traversals

    PAT甲级1119. Pre- and Post-order Traversals 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二进制树可以通过给定的一对后序和顺序遍历序列来确定,也可以通 ...

  8. PAT甲级1114. Family Property

    PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...

  9. PAT甲级1111. Online Map

    PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...

随机推荐

  1. CSS解析

    CSS(层叠样式表) CSS层叠样式表(Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. ...

  2. sql操作数据库(2)--->DQL、数据库备份和还原

    查询 查询表中的所有的行和列的数据 ​ select * from 表名; ​ select * from student; 查询指定列的数据:如果有多个列,中间用逗号隔开. select 列名1,列 ...

  3. 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库

    引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...

  4. 洛谷P4848 崂山白花蛇草水 权值线段树+KDtree

    题目描述 神犇 \(Aleph\) 在 \(SDOI\ Round2\) 前立了一个 \(flag\):如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇 \(Aleph\) 的实力,他轻松地进了山 ...

  5. Apache的Mod_rewrite学习(RewriteRule重写规则的语法) 转

    RewriteRuleSyntax: RewriteRule Pattern Substitution [flags] 一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要.对Apa ...

  6. 【高精度】计算2的N次方

    题目相关 [题目描述] 任意给定一个正整数N(N≤100),计算2的n次方的值. [输入] 输入一个正整数N. [输出] 输出2的N次方的值. [输入样例] 5 [输出样例] 32 分析 本题考察的是 ...

  7. C#处理医学图像(二):基于Hessian矩阵的医学图像增强与窗宽窗位

    根据本系列教程文章上一篇说到,在完成C++和Opencv对Hessian矩阵滤波算法的实现和封装后, 再由C#调用C++ 的DLL,(参考:C#处理医学图像(一):基于Hessian矩阵的血管肺纹理骨 ...

  8. 【Java基础】基本语法-变量与运算符

    基本语法-变量与运算符 关键字和保留字 关键字定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词). 关键字特点:关键字中所有字母都为小写. 用于定义数据类型:class.interf ...

  9. Java虚拟机常用的性能监控工具

    基础故障处理工具 jps: 虚拟机进程状况工具 功能:来处正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及本地虚拟机唯一ID. 它是使用频率最高的命令行工具,因为其他JDK工具大多需要输入他查询到 ...

  10. Java线程安全与锁优化,锁消除,锁粗化,锁升级

    线程安全的定义 来自<Java高并发实战>"当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法的时候进行任何 ...