A1056 Mice and Rice (25 分| queue用法,附详细注释,逻辑分析)
写在前面
- 思路分析
- np为老鼠数量, ng为每组最多g个老鼠。
- 先给出np个老鼠重量,再给出老鼠初始顺序
- 每ng个老鼠分为1组,对于每组老鼠,选出最重的那个,晋级下1轮比赛,然后依次再以np个老鼠1组分类,然后选出重量最大的。直到只剩下1只老鼠,排名为1
- 实现分析:
- 结构体node表示老鼠,weight、index:排名顺序老鼠下标、index0排名前老鼠下标、rank最终要输出的老鼠排名
- 将所有老鼠按照排名后顺序依次放入队列中,对于队列中的每1个老鼠,按照分组后选择最大
重量的比赛规则,将每次分组获得第1的老鼠放入队列尾部 - 当前剩下老鼠可以分为group组,这1组⾥没有晋级的老鼠排名为group+1
- group计算方法:如果当前轮次人数正好可以被每组ng人的ng整除,那么就有人数/ng个组。如果不能被整除,就有剩下来的⼀些⽼鼠分为1组,就是人数/ng + 1组
- cnt用来控制当前组内第几个人,如果cnt能够被ng整除说明已经是下1组,就cnt = 0;
- 否则cnt不断++,同时将最重的老鼠体重赋值给maxn,最重老鼠的node赋值给maxnode
- 最后将结果结构体按照index0排序,排序后按序输出
- 理解题意有一定难度,细节处理耗费大量时间
- 读题费老大劲,,,
- 初步学习
- 可迭代调试,进1步加深理解
测试用例
input: 11 3 25 18 0 46 37 3 19 22 57 56 10 6 0 8 7 10 5 9 1 4 2 3output: 5 5 5 2 5 5 5 3 1 3 5
ac代码
#include <iostream> #include <queue> #include <vector> #include <algorithm> using namespace std; struct node {int weight, index, rank, index0; }; bool cmp1(node a, node b) {return a.index0 < b.index0; } int main() {int n, g, num;scanf("%d%d", &n, &g);vector<int> v(n);vector<node> w(n);for(int i = 0; i < n; i++)scanf("%d", &v[i]);for(int i = 0; i < n; i++){scanf("%d", &num);w[i].weight = v[num];w[i].index = i;w[i].index0 = num;}queue<node> q;for(int i = 0; i < n; i++)q.push(w[i]);while(!q.empty()){int sizes = q.size();if(sizes == 1){node tmp = q.front();w[tmp.index].rank = 1;break;}// 计算组数int group = sizes / g;if(sizes % g != 0)group += 1;node maxnode;int maxn = -1, cnt = 0;for(int i = 0; i < sizes; i++){node tmp = q.front();w[tmp.index].rank = group + 1;q.pop();cnt++;if(tmp.weight > maxn){maxn = tmp.weight;maxnode = tmp;}if(cnt == g || i == sizes - 1){cnt = 0;maxn = -1;q.push(maxnode);}}}sort(w.begin(), w.end(), cmp1);for(int i = 0; i < n; i++){if(i != 0) printf(" ");printf("%d", w[i].rank);}return 0; }
A1056 Mice and Rice (25 分| queue用法,附详细注释,逻辑分析)相关推荐
- 1056 Mice and Rice (25分)
1056 Mice and Rice (25分) 参考 题目读了好久都没读明白...看了上方链接的解释才懂什么意思,感觉好绕... 第二行为0~n-1的老鼠重量,第三行为合并的次序序号,最后按0到n- ...
- 1056 Mice and Rice (25 分)【难度: 一般 / 知识点: 模拟】
https://pintia.cn/problem-sets/994805342720868352/problems/994805419468242944 这里是用队列模拟. #include< ...
- PTA 1056 Mice and Rice (25分)
题面:自己读,甲级题面自己读; 神奇的做法 一开始以为就是一个堆栈的模拟 没考虑到复杂度写到一半发现 查找中位数的复杂度实在是太高了O(nnlog) 那不就裂开了嘛 后来想到 中位数 可以单独维护一个 ...
- 1056. Mice and Rice (25)
1056. Mice and Rice (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice an ...
- 1056 Mice and Rice (25 point(s))
Matter: 1.很难受,这个想了好长时间,发现没读懂题目.second line 是每个老鼠的质量(Wi is the weight of the i-th mouse),third lin ...
- 华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
一.题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏. 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子都被选完,房子最多的人获胜. 跳房子的过程 ...
- 校验注解:@Valid 和 @Validated区别与用法(附详细案例)
一.案例对象 本文章会以案例为主,讲解@Valid 和 @Validated这两个注解的区别与用法. 1.首先,创建一个学生对象,如下: import lombok.Data;/*** 学生对象*/ ...
- 1088 三人行 (20 分)(附详细注释,逻辑分析)
写在前面 逻辑题 丙的类型分析存在错误 输出值分析错误,输出甲的值,不是M的值 除去以上2点,题目相对简单,5分钟a题 细节问题,最耗时间 abs绝对值函数 print 函数类型错误(double型) ...
- 华为OD机试真题 Java 实现【二维伞的雨滴效应】【2023 B卷 100分】,附详细解题思路
目录 一.题目描述 二.输入描述 三.输出描述 四.解题思路 五.Java算法源码 六.效果展示 1.输入 2.输出 3.说明 大家好,我是哪吒. 做技术,我是认真的,立志于打造最权威的华为OD机试真 ...
最新文章
- python英语-50 行代码,实现中英文翻译
- Microsoft发布用于统一事件处理的Azure事件网格
- svm核函数gamma参数_非线性SVM与核函数
- tablestore列式存储原理_10分钟搞透:技术人必会的MySQL体系结构与存储引擎!
- Docker 入门尝鲜
- PyTorch 1.0 中文文档:序列化的相关语义
- context-param标签含义及与init-param标签的异同(转)
- 为什么华为a1路由器网速变慢_路由器需要每天都关吗?看完专家的解释恍然大悟...
- 信息安全法律法规知识点汇总(郑大信安个人总结版)
- KVM虚拟化平台搭建实操+KVM理论详解
- 拥有“中国诺贝尔奖”的未来论坛,会告诉我们怎样的未来? | 未来论坛 2017...
- 未转变者入侵服务器后台,未转变者(unturned)联机服务器创建方法
- size与capacity的区别
- JavaWeb个人信息修改及修改密码
- 车载以太网 > 百兆100BaseT1转TX盒子拆解(包含3类产品)
- 51群接龙-社区社群团购专业营销工具
- file.getOriginalFilename()
- 一个sql语句的编写 写出不及格门数大于等于2的学生的姓名和平均成绩
- 大佬们的“受锤”往事
- Tapdata 创始人唐建法:以秒级响应速度,为企业提供实时数据服务 | 阿里云云原生加速器特别报道