Здравствуйте, можете объяснить как работает этот код? Нашел решение задачи только на этом языке, а сам работаю с другим. Хотелось бы понять общий смысл решения
// 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;
}