ЕГЭ. Информатика. Поляков. Решение. C4-33
Последняя задача перед сдачей экзамена...
Условие🔗︎
Дан список результатов сдачи экзамена учащимися школ некоторого района, с указанием фамилии и имени учащегося, номера школы и итогового балла. Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая определяет номера школ, в которых больше всего учащихся получило за экзамен максимальный балл среди всех учащихся района.
На вход программе в первой строке подается количество учащихся во всех школах района N. В каждой из последующих N строк находится информация в следующем формате: <Фамилия> <Имя> <Номер школы> <Балл>
где <Фамилия>
- строка, состоящая не более, чем из 20 символов без пробелов, <Имя>
- строка, состоящая не более, чем из 20 символов без пробелов, <Номер школы>
- число от 1 до 99, <Балл>
– число от 0 до 100. Порядок следования строк - произвольный.
Пример входных данных:
6
Иванов Сергей 7 74
Сергеев Петр 3 82
Петров Кирилл 7 85
Кириллов Егор 3 82
Егоров Николай 7 85
Николаев Иван 19 85
Программа должна вывести номера школ, из которых наибольшее количество учащихся получило на экзамене максимальный балл среди всех учащихся района. Пример вывода для приведенного выше примера ввода:
7
Примечание. В данном примере максимальный балл по району равен 85, его набрало 2 учащихся из школы 7 и 1 учащийся из школы 19, поэтому выводится только номер школы 7.
При выполнении задания следует учитывать, что значение N может быть велико (до 10.000).
Решение на C++🔗︎
#include <stdio.h>
#include <string.h>
const int MAX_SCHOOL = 100;
struct info {
int ppls, balls;
};
int main()
{
int N;
scanf("%d", &N);
int school, balls, max_ball = 0, max_ppl = 0;
info arr[MAX_SCHOOL];
memset(arr, 0, MAX_SCHOOL * sizeof(info));
for (int i = 0; i < N; i++)
{
scanf("%*s %*s %d %d", &school, &balls);
// записываем в массив макимальное количество баллов в школе
// и количество человек, получившее их
if (balls == arr[school].balls)
{
arr[school].ppls++;
}
if (balls > arr[school].balls)
{
arr[school].balls = balls;
arr[school].ppls = 1;
}
// определяем максимальное количество людей и баллов
if (max_ppl < arr[school].ppls)
{
max_ppl = arr[school].ppls;
}
if (max_ball < balls)
{
max_ball = balls;
}
}
// выводим
for (int i = 0; i < MAX_SCHOOL; i++)
{
if (arr[i].ppls == max_ppl && arr[i].balls == max_ball)
{
printf("%d\n", i);
}
}
return 0;
}
Решение на Rust🔗︎
use std::{collections::HashMap, io};
#[derive(Clone)]
struct Info {
ppls: u32,
balls: u32,
}
fn main() {
let amount: u32 = read_input_value().parse().expect("Ошибка ввода");
let mut map: HashMap<u32, Info> = HashMap::new();
let mut max_balls = 0;
let mut max_ppls = 0;
for _i in 0..amount {
let input = read_input_value();
let parsed: Vec<&str> = input.split(' ').collect();
let school: u32 = parsed[2].parse().expect("Ошибка ввода school");
let balls: u32 = parsed[3].parse().expect("Ошибка ввода balls");
map.entry(school)
.and_modify(|item| {
if balls == item.balls {
item.ppls += 1;
}
if balls > item.balls {
item.balls = balls;
item.ppls = 1;
}
max_ppls = max_ppls.max(item.ppls);
max_balls = max_balls.max(balls);
})
.or_insert(Info { balls: 0, ppls: 0 });
}
for (school, item) in map {
if item.ppls == max_ppls && item.balls == max_balls {
println!("{}", school);
}
}
}
fn read_input_value() -> String {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Ошибка ввода");
input.trim().to_string()
}