【算法每日一练】PAT 甲级 1056 有超时 java

1056 Mice and Rice (25分)

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

题意

给出NP只老鼠的质量,并给出他们的初始顺序,按这些顺序把老鼠按每NG只分为一组,最后剩的也单独作为一组,对每组老鼠,选出质量最大的一只晋级,这样晋级的数量等于分组数量,对于这些晋级的再按照每NG只一组进行比较,选出最大的晋级,。直到最后只剩下一只老鼠,把这些老鼠的排名按照原顺序输出。

代码

package com.zixin.algorithm;

import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingQueue;
/**
 * 
 * @ClassName:  PATA1056   
 * @Description:
 * 				思路:
 * 					1、开一个结构体mouse 记录老鼠的质量和排名   定义一个队列,用来在算法过程中按顺序处理每轮的老鼠
 * 					2、分成group组 当前参加的有temp只  
 * 					3、每组晋级一只  因此当前轮晋级的总老鼠数等于group,且改轮未晋级的排名为group+!
 * 				问题:最后两个测试店超时
 * @author: Sanglp
 * @date:   2020年4月7日 上午9:14:56      
 * @Copyright:
 * 
 */
public class PATA1056 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int np = sc.nextInt();
		int ng = sc.nextInt();
		Mouse[] order = new Mouse[np];
		for(int i=0;i<np;i++) {
			Mouse m = new Mouse();
			m.weight=sc.nextInt();
			order[i]=m;
					
		}
		Queue<Integer> q =new LinkedBlockingQueue<Integer>();
		for(int i=0;i<np;i++) {
			int s = sc.nextInt();
			//System.out.println(s);
			q.add(s);
		}
		
		sc.close();
		int temp=np;
		int group=0;
		while(q.size()!=1) {
			if(temp%ng==0) {
				group=temp/ng;
			}else {
				group=temp/ng+1;
			}
			for(int i=0;i<group;i++) {
				int k= q.peek();
				for(int j=0;j<ng;j++) {
					if(i*ng+j>=temp) {
						break;
					}
					int front = q.peek();
					if(order[front].weight>order[k].weight) {
						k=front;//找出质量最大的
					}
					order[front].rank=group+1;//未晋级的排名为group+!
					q.remove();//处理过的从队列中移除
				}
				q.add(k);//将最大的重新添加到队尾
			}
			temp=group;//group只老鼠晋级 因此下一次需要处理的老鼠的数量是group
		}
		order[q.peek()].rank=1;
		for(int i=0;i<np;i++) {
			System.out.print(order[i].rank);
			if(i<np-1) {
				System.out.print(" ");
			}
		}
	}
	
}

class Mouse{
	int weight;
	int rank;
}

提交

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值