Проблема в том, что ты пытаешься выбрать мешки на семена и на продажу одновременно в одном цикле. Из-за этого, если мешок подходит для продажи (условие sredi(arr[i], m) <= y), он не рассматривается для семян, даже если подходит (sredi(arr[i], m) <= x).
Вот исправленный код:
#include
#include
#include
int sredi(int* arr, int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
return sum / n;
}
int main() {
using namespace std;
setlocale(LC_ALL, "ru");
srand(time(NULL));
int n, m, k, x, y;
m = rand() % 10 + 1; // m должно быть хотя бы 1
cout << "n=", cin >> n, cout << endl;
cout << "k=", cin >> k, cout << endl;
cout << "x=", cin >> x, cout << endl;
cout << "y=", cin >> y, cout << endl;
int** arr = new int* [n];
for (int i = 0; i < n; i++)
arr[i] = new int[m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = rand() % 10;
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << "_____\n";
for (int i = 0; i < n; i++) {
cout << sredi(arr[i], m) << " ";
}
cout << endl;
// Сначала выбираем мешки на семена
int flag_k = 0;
for (int i = 0; i < n && flag_k < k; i++) {
if (sredi(arr[i], m) <= x) {
flag_k++;
cout << "Мешок № " << i << " на семена, кол-во сора " << sredi(arr[i], m) << endl;
}
}
// Затем выбираем мешки на продажу
for (int i = 0; i < n; i++) {
// Проверяем, не был ли этот мешок уже выбран для семян
bool used = false;
for (int j = 0; j < flag_k; j++) {
if (i == j) {
used = true;
break;
}
}
if (used) {
continue;
}
if (sredi(arr[i], m) <= y) {
cout << "Мешок № " << i << " на продажу, кол-во сора " << sredi(arr[i], m) << endl;
}
}
// Оставшиеся мешки идут на корм скоту
for (int i = 0; i < n; i++) delete[] arr[i];
delete[] arr;
return 0;
}
Изменения:
Отдельные циклы: Используем два цикла for: первый для выбора мешков на семена, второй - на продажу.
Проверка на использование: В цикле для продажи проверяем, не был ли мешок уже выбран для семян.
Теперь программа сначала выберет нужное количество мешков на семена (если это возможно), а затем - на продажу, не затрагивая уже выбранные.
в n мешков, пронумеровал их и измерил количество сора в каждом мешке. В
ходе этого измерения получился массив значений сора. Крестьянину
необходимо k мешков оставить на семена со средним количеством сора не
более x. А также как можно больше выставить на продажу со средним
количеством сора не более y. Оставшиеся мешки пойдут на корм скоту. Как в
том случае необходимо поступить крестьянину?
Ошибка: когда я добавляю в условный оператор if условие (k <= flag_k), то программа не выводит мешки на семена !
#include <iostream>
#include <random>
#include <ctime>
int sredi(int* arr, int n) {
int sum = 0;
int otv = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
otv = sum / n;
return otv;
}
int main() {
using namespace std;
setlocale(LC_ALL, "ru");
srand(time(NULL));
int n, m, k, x, y;
m = rand() % 10;
//m = 0;
cout << "n=", cin >> n, cout << endl;
//cout << "m=", cin >> m, cout << endl;
cout << "k=", cin >> k, cout << endl;
cout << "x=", cin >> x, cout << endl;
cout << "y=", cin >> y, cout << endl;
int** arr = new int* [n];
for (int i = 0; i < n; i++)
arr[i] = new int[m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = rand() % 10;
}
}
cout << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << arr[i][j], cout << " ";
}
cout << endl;
}
cout << "_____\n";
for (int i = 0; i < n; i++) {
cout << sredi(arr[i], m) << " ";
}
cout << endl;
int flag_k = 0;
for (int i = 0; i < n; i++) {
int metrik_i = 0;
if (sredi(arr[i], m) <= x && k <= flag_k) {
flag_k = flag_k + 1;
metrik_i = i;
cout << "мешок № " << i << " на семена, кол-во сора " << sredi(arr[i], m) << endl;
}
if (sredi(arr[i], m) <= y && metrik_i != i) {
cout << "мешок № " << i << " на продажу, кол-во сора " << sredi(arr[i], m) << endl;
}
}
for (int i = 0; i < n; i++) delete[] arr[i];
delete[] arr;
return 0;
}