1056 Mice and Rice (25 point(s))
排序
题目
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 N**P programmers. Then every N**G programmers 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 N**G 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: N**P and N**G (≤1000), the number of programmers and the maximum number of mice in a group, respectively. If there are less than N**G 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 N**P distinct non-negative numbers W**i (i=0,⋯,N**P−1) where each W**i is the weight of the i-th mouse respectively. The third line gives the initial playing order which is a permutation of 0,⋯,N**P−1 (assume that the programmers are numbered from 0 to N**P−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
思路
题意
一共有 N p N_p Np只老鼠,每 N G N_G NG只分为一组。给出所有老鼠的重量和分组顺序,每轮每 N G N_G NG只老鼠一组进行评估,体重最重的胜出进入下一轮,同一轮输掉的老鼠全部算相同名次。如果剩余老鼠数小于 N G N_G NG则自动组成一组。一直比较直到最重的老鼠胜出。
分析
用struct类来储存老鼠的index和进入的比较level信息,比较完后按照level大小排序,给相应index的老鼠用另一个数组记录名次即可。
用while循环来判断是否还需要进行比较。比较过程中用temp数组来存储每轮比较的老鼠index,next数组来动态存储正在进行比较的该轮中每组胜出的老鼠index,每轮比较用next数组更新temp,当temp数组的大小为1的时候则结束比较。用两层循环来得出每轮每组最重的老鼠,最重的老鼠加到next数组中,且相应的level增加,表示可以进入下一轮。
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node {
int index, level = 0;
};
bool cmp(node a, node b) {
return a.level > b.level;
}
int main() {
int np, ng, k, max, micerank = 1, before, num = 0;
scanf("%d%d", &np, &ng);
vector<node> v(np);
vector<int> w(np), order(np), ans(np);
for (int i = 0; i < np; ++i) {
scanf("%d", &w[i]);
v[i].index = i;
}
for (int i = 0; i < np; ++i)
scanf("%d", &order[i]);
vector<int> temp = order;
while (temp.size() > 1){
vector<int> next;
for (int i = 0; i < temp.size(); i += ng) {
max = -1;
for (int j = i; j < i + ng && j < temp.size(); ++j) {
if (w[temp[j]] > max) {
max = w[temp[j]];
k = j;
}
}
next.push_back(temp[k]);
v[temp[k]].l++;
}
temp = next;
}
sort(v.begin(), v.end(), cmp);
before = v[0].level;
for (int i = 0; i < np; ++i) {
if (v[i].level == before)
num++;
else {
micerank += num;
before = v[i].level;
num = 1;
}
ans[v[i].index] = micerank;
}
for (int i = 0; i < np; ++i)
printf("%d%s", ans[i], i == np - 1 ? "\n" : " ");
return 0;
}
注意
- 涉及到循环的变量检查是否需要初始化。
- 注意循环中i和j的范围。