统计射击比赛成绩_100分_A/B卷复用_自定义排序/字符串

统计射击比赛成绩

题目描述:

给定一个射击比赛成绩单,包含 多个选手若干次射击的成绩分数,请对 每个选手按其最高3个分数之和进行降序排名,输出降序排名后的选手 ID 序列。
条件如下:
   1、一个选手可以有多个射击成绩的分数,且次序不固定。
   2、如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手。
   3、如果选手的成绩之和相等,则成绩之和相等的选手按照其 ID降序排列。

输入输出描述:

输入描述:

  输入第一行,一个整数 N,表示该场比赛总共进行了N次射击,产生N个成绩分数 (2<=N<=100)
  输入第二行,一个长度为 N 整数序列,表示参与每次射击的选手 ID (0<=ID<=99)。
  输入第三行,一个长度为 N 整数序列,表示参与每次射击的选手对应的成绩 (0<=成绩<=100)。

输出描述:

  符合题设条件的降序排名后的选手ID序列。

示例1:

输入:
	13
	3,3,7,4,4,4,4,7,7,3,5,5,5
	53,80,68,24,39,76,66,16,100,55,53,80,55
输出:
	5,3,7,4
说明: 
	该场射击比赛进行了13次,参寒的选手为 3,4,5,7。
	3号选手成绩: 53.80.55,最高3个成绩的和为: 80+55+53=188。
	4号选手成绩: 24,39,76,66,最高3个成绩的和为: 76+66+39=181.
	5号选手成绩: 53,80,55,最高3个成绩的和为: 80+55+53=188.
	7号选手成绩: 68,16,100,最高3个成绩的和为: 100+68+16=184.
	比较各个选手最高3个成绩的和,有 3号=5号>7号>4号,由于3号和5号成绩相等且ID号5>3,所以输出为: 5,3,7,4

解题思路:

1、用Map来统计每位选手的成绩情况:key为选手id,value为选手的射击成绩(且value使用优先级队列来装,可以顺便把成绩排序了)。
2、遍历每个选手,如果他的成绩次数小于3,淘汰掉。否则,将选手id、最高3个分数累加和记录下来
3、按照题目的排序要求进行自定义排序后输出结果即可

代码:

public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int n = Integer.parseInt(in.nextLine());
	String[] ids = in.nextLine().split(",");
	String[] scores = in.nextLine().split(",");

	// Map的可以为选手id,value为选手的全部设计成绩,且是排好序的
	Map<Integer, PriorityQueue<Integer>> map = new HashMap<>();

	// 根据选手id,初始化Map
	for (int i = 0; i < n; i++) {
		int id = Integer.parseInt(ids[i]);
		int score = Integer.parseInt(scores[i]);

		if (map.containsKey(id)) {
			PriorityQueue<Integer> priorityQueue = map.get(id);
			priorityQueue.add(score);
		} else {
			PriorityQueue<Integer> sco = new PriorityQueue<>((a, b) -> b - a);
			sco.add(score);
			map.put(id, sco);
		}
	}

	// 统计选手的总成绩
	List<int[]> list = new ArrayList<>();
	Iterator<Map.Entry<Integer, PriorityQueue<Integer>>> iterator = map.entrySet().iterator();
	while (iterator.hasNext()) {
		Map.Entry<Integer, PriorityQueue<Integer>> next = iterator.next();
		PriorityQueue<Integer> value = next.getValue();
		// 一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
		if (value.size() > 2) {
			// 封装成长度为2的一维数组,分别是:选手id、最高3个分数
			int[] contestant = new int[] {next.getKey(), value.poll() + value.poll() + value.poll()};
			list.add(contestant);
		}
	}

	// 自定义排序,
	Collections.sort(list, (a, b)->{
		return b[1] == a[1] ? b[0] - a[0] : b[1] - a[1];
	});

	// 输出结果
	for (int[] ints : list) {
		System.out.print(ints[0] + " ");
	}
}

自定义排序题目

查找舆情热词_热词排序_100分_A/B卷复用_自定义排序/字符串/逻辑分析模拟
最小数字_100分_A/B复用卷_数组/字符自定义排序
按身高体重排队_100分_A/B复用卷_排序
字符串重新排列_100分_2023A卷_字符串/数据结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include "driverlib.h" #define TIMER_PERIOD 8192 void Timer_A0_PWM_Init(void) { Timer_A_outputPWMParam htim = {0}; //P1.2复用输出 GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2); //时钟源选为SMCLK = 1048576 HZ htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; //频系数设为32 32768HZ htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_32; //装载值设为8192 - 1 ,周期为0.25s htim.timerPeriod = TIMER_PERIOD - 1; //P1.2 对应 TA0.1 故设为TIMER_A_CAPTURECOMPARE_REGISTER_1 时器为0 htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1; //选择复位置位模式 htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET; //设置占空比,为5% htim.dutyCycle = TIMER_PERIOD / 20 ; //P1.2 对应 TA0.1 为TIMER_A0_BASE Timer_A_outputPWM(TIMER_A0_BASE, &htim); } void Timer_A1_PWM_Init(void) { Timer_A_outputPWMParam htim = {0}; //P1.3复用输出 GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN3); //时钟源选为SMCLK = 1048576 HZ htim.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; //频系数设为32 32768HZ htim.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_32; //装载值设为8192 - 1 ,周期为0.25s htim.timerPeriod = TIMER_PERIOD - 1; //P1.3 对应 TA1.1 故设为TIMER_A_CAPTURECOMPARE_REGISTER_1 时器为1 htim.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1; //选择复位置位模式 htim.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET; //设置占空比,为10% htim.dutyCycle = TIMER_PERIOD / 10 ; //P1.3 对应 TA1.1 为TIMER_A1_BASE Timer_A_outputPWM(TIMER_A1_BASE, &htim); }
07-16

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值