ЕГЭ. Информатика. Поляков. Решение. C4-35

1 минут

Ещё одна задача, подобную решал ранее. Добавил комментариев в код, для понятности.

Условие🔗︎

В командных олимпиадах по программированию для решения предлагается не более 12 задач. Команда может решать предложенные задачи в любом порядке. Подготовленные решения команда посылает в единую проверяющую систем соревнований. Вам предлагается написать эффективную, в том числе и по используемой памяти, программу, которая будет статистически обрабатывать пришедшие запросы на проверку, чтобы определить популярность той или иной задачи. Следует учитывать, что количество запросов в списке может быть очень велико, например, когда олимпиада проводится через Интернет. перед текстом программы кратко опишите используемый вами алгоритм решения задачи. На вход программе в первой строчке подается количество пришедших запросов N. В каждой из последующих N строк записан номер задачи от 1 до 12. Пример входных данных:

6
1
2
1
1
5
2

Программа должна вывести список всех задач, встречающихся в запросах, в порядке возрастания (неубывания) количества запросов по ней с указанием этого количества запросов. Каждая задача должна быть выведена только один раз. Пример выходных данных для приведенных входных данных:

5 1
2 2
1 3

Решение на C++🔗︎

#include <stdio.h>
#include <iostream>
#include <string.h>

struct info {
    int id, count;
} array[12];

int main()
{
    memset(array, 0, 12 * sizeof(info)); // обнуляем массив array
    int N, tmp, found = 0;
    scanf("%d", &N);

    for (int i = 0; i < N; i++)
    {
        scanf("%d", &tmp);
        // если число есть в массиве, то мы увеличиваем его count на 1, а не добавляем новый элемент
        for (int j = 0; j < N; j++)
        {
            if (array[j].id == tmp)
            {
                array[j]. count++;
                found = 1;
            }
        }
        // если числа нет в массиве, то добавим его
        if (found == 0)
        {
            array[i].id = tmp;
            array[i].count = 1;
        }
        found = 0;
    }
    // сортируем массив методом пузырька
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N-1; j++)
        {
            if (array[j].count > array[j+1].count)
            {
                std::swap(array[j], array[j+1]);
            }
        }
    }
    // выводим
    for (int i = 0; i < N; i++)
    {
        if (array[i].count != 0)
        {
            printf("%d %d\n", array[i].id, array[i].count);
        }
    }
    return 0;
}

Решение на Rust🔗︎

use std::io;

struct Info {
    value: i32,
    amount: usize,
}

fn main() {
    let mut values: Vec<Info> = Vec::new();
    let amount = read_input_value();

    for _i in 0..amount {
        let value = read_input_value();

        if let Some(item) = values.iter_mut().find(|it| it.value == value) {
            item.amount += 1;
        } else {
            values.push(Info { value, amount: 1 });
        }
    }

    values.sort_by(|a, b| b.amount.cmp(&a.amount));

    for item in values {
        println!("{} {}", item.value, item.amount);
    }
}

fn read_input_value() -> i32 {
    let mut input = String::new();

    io::stdin().read_line(&mut input).expect("Ошибка ввода");

    input.trim().parse().expect("Ошибка ввода")
}