Решение задачи на C/C++
Подскажите пожалуйста, что я делаю не так?
//N - const

for (int i = 0; i < N; i++)
{
for (int j = 1; j < N; j++)
{
if (arr[i] < arr[j])
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
else
{
arr[i] = 0;
}
}
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Не хотите начать перебирать не все элементы for (int j = 1; j < N; j++), а только те, что справа — for (int j = i+1; j < N; j++)? И еще — как мне кажется, "заменим значение" это совсем не означает "обменяем значения местами". Да, и не надо обнулять все подряд, надо только то, что надо — вне внутреннего цикла...
int main()
{
const int N = 9;
int arr[N] = { 2,9,8,5,9,3,4,5,2 };
for (int i = 0; i < N; i++)
{
bool is = false;
for (int j = i+1; j < N; j++)
{
if (arr[i] < arr[j])
{
arr[i] = arr[j];
is = true;
break;
}
}
if (!is) arr[i] = 0;
}
for(auto a: arr) cout << a << " ";
}
Автор решения: Nik
→ Ссылка
for (int i = 0; i < N; i++)
{
f = 1;
for (int j = i; j < N; j++)
{
if (arr[i] < arr[j]) {
arr[i] = arr[j];
f = 0;
break;
}
}
if (f) {
arr[i] = 0;
}
}
Сразу скажу что если задача олимпиадная, то скорее всего не зайдет на больших тестах, лучше использовать префиксные суммы или что-то на подобии их. А теперь что я изменил:
- В задаче сказано что мы проходим только последующие поля массива, следовательно
for (int j = i; j < N; j++)
- Далее пройдем все последующие поля и если поле больше, заменяем(никаких смен мест тут не нужно!). Далее если даже после прохода всего цикла мы так и не поменяли ячейку(переменная f будет равна 1), то заменим ее на ноль. Важно это делать вне цикла, иначе мы проверяем ТОЛЬКО следующее число, и то не совсем правильно...
Возможны ошибки, я даже не компилировал. Если что пишите сюда, я исправлю