PAT-1056 Mice and Rice (分组决胜问题)
1056. Mice and Rice
Mice and Rice is the name of a programming contest in which each programmer must write a piece of code to control the movements of a mouse in a given map. The goal of each mouse is to eat as much rice as possible in order
to become a FatMouse.
First the playing order is randomly decided for NP programmers. Then every NGprogrammers are grouped in a match. The fattest mouse in a group wins and enters the
next turn. All the losers in this turn are ranked the same. Every NG winners are then grouped in the next match until a final winner is determined.
For the sake of simplicity, assume that the weight of each mouse is fixed once the programmer submits his/her code. Given the weights of all the mice and the initial playing order, you are supposed to output the ranks for the programmers.
Input Specification:
Each input file contains one test case. For each case, the first line contains 2 positive integers: NP and NG(<= 1000), the number of programmers and the maximum
number of mice in a group, respectively. If there are less than NG mice at the end of the player's list, then all the mice left will be put into the last group. The second line contains NP distinct
non-negative numbers Wi (i=0,...NP-1) where each Wi is the weight of the i-th mouse respectively. The third line gives the initial playing order which is a permutation
of 0,...NP-1 (assume that the programmers are numbered from 0 to NP-1). All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the final ranks in a line. The i-th number is the rank of the i-th programmer, and all the numbers must be separated by a space, with no extra space at the end of the line.
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
题目大意:这是一个比赛中不断分组最终决出胜者的题目。首先给出选手数量np和每组人数ng,然后按序号顺序给出每个选手的分数,接着是以选手序号组成的比赛顺序,按照这个顺序把选手分成不同组,每组有一个优胜者加入下一轮并重复上述分组,而失败者拥有相同的排名并被淘汰。要求输出最终所有选手的排名。
主要思想:思路很简单,利用循环来模拟每轮的比赛,首先需要求出当前轮的组数,然后对于每组成员找出得分最高的选手并将其加入下一轮,将失败者的排名设置为当前组数+1。其中重点是如何更新下一轮的比赛顺序,这里用的是vector容器来储存比赛顺序,将每一组胜者直接覆盖在数组的前端,而下一轮比赛的选手数就是此轮的组数。
#include <iostream>
#include <vector>
using namespace std;
int weight[1000]; //选手得分
int rank_id[1000]; //选手排名
vector<int> order; //比赛顺序
int get_max(int lo, int hi, int p);
int min(int a, int b); int main(void) {
int np, ng, i; cin >> np >> ng;
for (i = 0; i < np; i++) {
cin >> weight[i];
}
for (i = 0; i < np; i++) {
int t;
cin >> t;
order.push_back(t);
}
int n = np;
while (true) {
int groups = n / ng; //n是当前轮比赛的人数
int r = n % ng;
if (r > 0) groups++; //求出分组数
int lo = 0, count = 0;
int win_id;
for (i = 0; i < groups; i++) {
int hi = min(lo+ng-1, n-1);
win_id = get_max(lo, hi, groups); //该组的优胜者序号
order[count++] = win_id; //不断更新下一轮的
lo = hi+1;
}
n = groups;
if (n == 1) {
rank_id[win_id] = 1;
break;
}
}
cout << rank_id[0];
for (i = 1; i < np; i++)
cout << " " << rank_id[i];
cout << endl; return 0;
} //获得当前组优胜选手的序号,并且把失败者排名设置为group+1
int get_max(int lo, int hi, int p) {
int max_id, i;
int max = 0;
for (i = lo; i <= hi; i++) {
if (max < weight[order[i]]){
max = weight[order[i]];
max_id = order[i];
}
}
for (i = lo; i <= hi; i++) {
if (order[i] != max_id)
rank_id[order[i]] = p + 1;
} return max_id;
}
int min(int a, int b) {
return a < b ? a : b;
}
PAT-1056 Mice and Rice (分组决胜问题)的更多相关文章
- PAT 1056 Mice and Rice[难][不理解]
1056 Mice and Rice(25 分) Mice and Rice is the name of a programming contest in which each programmer ...
- PAT 1056 Mice and Rice
#include <cstdio> #include <climits> #include <cstdlib> #include <vector> #i ...
- pat 甲级 1056. Mice and Rice (25)
1056. Mice and Rice (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice an ...
- PAT 甲级 1056 Mice and Rice (25 分) (队列,读不懂题,读懂了一遍过)
1056 Mice and Rice (25 分) Mice and Rice is the name of a programming contest in which each program ...
- PAT Advanced 1056 Mice and Rice (25) [queue的⽤法]
题目 Mice and Rice is the name of a programming contest in which each programmer must write a piece of ...
- 1056 Mice and Rice (25分)队列
1.27刷题2 Mice and Rice is the name of a programming contest in which each programmer must write a pie ...
- 1056. Mice and Rice (25)
时间限制 30 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice and Rice is the name of a pr ...
- PAT甲题题解-1056. Mice and Rice (25)-模拟题
有n个老鼠,第一行给出n个老鼠的重量,第二行给出他们的顺序.1.每一轮分成若干组,每组m个老鼠,不能整除的多余的作为最后一组.2.每组重量最大的进入下一轮.让你给出每只老鼠最后的排名.很简单,用两个数 ...
- PAT (Advanced Level) 1056. Mice and Rice (25)
简单模拟. #include<iostream> #include<cstring> #include<cmath> #include<algorithm&g ...
- 【PAT甲级】1056 Mice and Rice (25 分)
题意: 输入两个正整数N和M(<=1000),接着输入两行,每行N个数,第一行为每只老鼠的重量,第二行为每只老鼠出战的顺序.输出它们的名次.(按照出战顺序每M只老鼠分为一组,剩余不足M只为一组, ...
随机推荐
- 【手把手教你】win10 虚拟机 VMware Workstation Pro 15下安装redhat 8.0
安装redhat8.0 和安装Ubuntu 差别不大 可以参考上篇文章:https://www.cnblogs.com/zero-vic/p/11593683.html 但是redhat 8.1 b ...
- linux 之学习路线
原文地址:https://www.oschina.net/question/587367_156024 推荐的发行版如下: UBUNTU 适合纯菜鸟,追求稳定的官方支持,对系统稳定性要求较弱,喜欢最新 ...
- Xapian实战(二):core concepts
参考资料 core concepts 正文 1. 并发性 xapian不包含任何全局变量,所以多线程编程中,在没有共享资源的情况下可以安全使用xapian.在实际操作中,由于每个线程都可以创建自己的x ...
- 数学--数论--HDU 2197 本原串 (推规律)
由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串? 答案mod2008. 例如,100100不是本原串,因为他是由两个 ...
- RF(For 循环)
一.介绍:RobotFrameWork 支持 FOR 循环语句,语法和 Python 的语法基本相同,但 RobotFrameWork 中,"FOR" 关键字前面需要增加一个 &q ...
- docker学习笔记一篇就通系列(持续更新)
docker三要素 仓库 镜像 容器 仓库 仓库用来存放docker的镜像,类似于github存放代码医养 镜像 镜像是一个模板,封装了应用程序和配置依赖的可交付的运行环境,这个打包好的运行环境就是镜 ...
- vue-infinite-scroll------vue的无线滚动插件
vue-infinite-scroll------vue的无线滚动插件 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 V ...
- L - A Heap of Heaps CodeForces - 538F 主席树
L - A Heap of Heaps CodeForces - 538F 这个是一个还比较裸的静态主席树. 这个题目的意思是把这个数组变成k叉树,然后问构成的树的子树小于等于它的父节点的对数有多少. ...
- VM虚拟机手动配置IP地址
1.查看虚拟机的网关 编辑-->虚拟网络编辑器 VMnet8 NAT模式-->NAT设置-->网关IP 2.设置IP地址 系统-->首选项-->网络连接 system e ...
- win10卸载多余应用-通过命令行卸载
Win10 APP 卸载方式和明细,网络最全.直接包含了编辑好的文件,可以打开编辑或直接删除,部份APP可卸载,但注释了,各位可以看情况是否删除.直接把代码复制保存扩展名为“ps1”即可直接运行,这是 ...