1056 Mice and Rice (25 point(s)) PAT甲级

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的范围。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值