1082 射击比赛 (20 分)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

struct Stu{
	int id;
	int x;
	int y;
	int sc;
};

bool cmp(Stu st1,Stu st2){
	return st1.sc<st2.sc;
}

int main() {
	int n;
	cin>>n;
	Stu st[n];
	for(int i=0;i<n;i++){
		cin>>st[i].id>>st[i].x>>st[i].y;
		st[i].sc=sqrt(st[i].x*st[i].x+st[i].y*st[i].y);
	}
	sort(st,st+n,cmp);
	printf("%04d %04d",st[0].id,st[n-1].id);
	return 0;
}

 

在解决华为OD机试中的“射击比赛”问时,需要处理输入数据并根据要求计算每个选手的最高、最低和平均。以下是一个完整的Python实现方案: ### 输入格式 1. 第一行输入一个整数`N`,表示射击次数。 2. 第二行输入一个长度为`N`的整数序列,表示每次射击的选手ID。 3. 第三行输入一个长度为`N`的整数序列,表示对应的成绩。 ### 输出要求 - 每个选手的ID以及对应的最高、最低和平均(保留两位小数)。 ### Python代码实现 ```python # 读取输入 n = int(input()) player_ids = list(map(int, input().split())) scores = list(map(int, input().split())) # 创建字典存储每个选手的成绩 from collections import defaultdict score_dict = defaultdict(list) # 将成绩按选手ID类 for pid, score in zip(player_ids, scores): score_dict[pid].append(score) # 计算每个选手的最高、最低和平均 results = [] for pid in sorted(score_dict.keys()): max_score = max(score_dict[pid]) min_score = min(score_dict[pid]) avg_score = round(sum(score_dict[pid]) / len(score_dict[pid]), 2) results.append((pid, max_score, min_score, avg_score)) # 输出结果 for result in results: print(f"{result[0]} {result[1]} {result[2]} {result[3]:.2f}") ``` ### 示例运行 假设输入如下: ``` 6 1 2 1 2 3 1 95 85 90 80 75 92 ``` 输出结果为: ``` 1 95 90 92.33 2 85 80 82.50 3 75 75 75.00 ``` ### 算法析 - **时间复杂度**:O(N),其中N是射击次数。使用了哈希表来类和统计每个选手的成绩,遍历所有成绩一次即可完成类。 - **空间复杂度**:O(N),用于存储每个选手的成绩列表。 此算法适用于华为OD机试中的“射击比赛目,并且能够高效地处理输入规模[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值