@hikawy

Можете объяснить, что делает этот код с++?

Здравствуйте, можете объяснить как работает этот код? Нашел решение задачи только на этом языке, а сам работаю с другим. Хотелось бы понять общий смысл решения

// 1.
// Т.е на вход нам подают

// 3 50
// 8 4 2

// Где 3 - кол-во бочек, 50 - % испарения
// И нам нужно вычислить какое максимальное одинаковое число мы можем
// получить в каждой из бочек (С наименьшими потерями конечно)

// По условию у нас может быть до 10000 штук.

#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>

typedef std::vector<double> T_values;
typedef long long T_int;

int get_rand_val_in_segment(T_int min, T_int max) {
    return rand() % (max - min + 1) + min;
}

T_values get_rand_values(T_int n) {
    const T_int min = 1;
    const T_int max = 1000;

    T_values res(n);

    for (auto &val: res) {
        val = get_rand_val_in_segment(min, max);
    } //for

    return res;
}

T_int get_rand_percent() {
    return get_rand_val_in_segment(0, 100);
}

double get_max_average(T_values const &values, double percent) {
    auto values_sort = values;

    std::sort(values_sort.begin(), values_sort.end(), std::greater<T_int>());

    auto k = (100 - percent) / 100;

    double sum {};

    for (auto val: values_sort) {
        sum += val;
    }

    double sum_L {};
    double sum_R {sum};

    T_int count_L {};
    T_int count_R {values_sort.size()};
    double res {};

    for (size_t i{}; i < values_sort.size() - 1; ++i) {
        sum_L += values_sort[i];
        sum_R -= values_sort[i];

        ++count_L;
        --count_R;

        auto x = (count_R * sum_L - count_L * sum_R) / (count_R + count_L * k);

        auto average_val = (sum_L - x) / count_L;

        if (average_val <= values_sort[i]
            && average_val >= values_sort[i + 1]
            && (i == 0 || average_val > res)) {
            res = average_val;
        } //if
    } //for

    return res;
}

void print_values(T_values const &values) {
    for (auto val: values) {
        std::cout << val << '\t';
    }
    std::cout << std::endl;
}

int main() {
    srand(unsigned(time(0)));

    std::cout << "n\t\t= ";
    T_int n {};
    std::cin >> n;

    auto values = get_rand_values(n);
    auto percent = get_rand_percent();

    auto max_average = get_max_average(values, percent);

    if (n < 100) {
        print_values(values);
    }

    std::cout << "p\t\t= " << percent << std::endl
              << "max_average\t= " << max_average << std::endl;
}
  • Вопрос задан
  • 246 просмотров
Решения вопроса 1
NeiroNx
@NeiroNx
Программист
расчитывает max_average для введенного числа случайных значений и случайного процента.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы