Построить дуболомов в одну шеренгу но так, чтобы они опять были расположены по росту от самого высокого к самому низкому - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите решить задачу. Имя входного файла: merge.dat Имя выходного файла: merge.sol Ограничение времени: 1 с Ограничение памяти: 64 M DOC-file Капрал Арум столкнулся с неразрешимой для него задачей. Перед ним стоят две шеренги деревянных солдат Урфина Джюса (дуболомов), в каждой из них дуболомы расположены по росту (от самого высокого к самому низкому). Капралу необходимо построить дуболомов в одну шеренгу но так, чтобы они опять были расположены по росту от самого высокого к самому низкому. Помогите капралу Аруму решить эту задачу. Формат входного файла merge.dat Текстовый файл merge.dat содержит четыре строки. В первой строке записано натуральное число N (1 ≤ N ≤ 100 000) — количество дуболомов в первой шеренге. Вторая строка содержит N натуральных чисел, записанных через пробел. Числа идут в невозрастающем порядке. Каждое число лежит в диапазоне от 1 до 1 000 000 000. В третьей строке записано натуральное число M (1 ≤ M ≤ 100 000) — количество дуболомов во второй шеренге. Четвертая строка содержит M натуральных чисел, записанных через пробел. Числа идут в невозрастающем порядке. Каждое число лежит в диапазоне от 1 до 1 000 000 000. Формат выходного файла merge.sol Текстовый файл merge.sol должен содержать N+M чисел, идущих в невозрастающем порядке. Каждое число — это рост соответствующего дуболома из первой или из второй шеренги. Каждое число должно выводиться в отдельную строку. ПримерыВходные данные в файле merge.dat
5 10 7 7 3 2 4 9 8 7 1 10 9 8 7 7 7 3 2 1
Результат работы в файле merge.sol
4 6 5 4 1 3 9 6 3 9 6 6 5 4 3 1
Программа выглядит так.
#include <stdio.h>
 
int a[100000];
int mn = 0;
 
void merge(int l, int r) {
    if (r == l)
        return;
    if (r - l == 1) {
          if (a[r] < a[l]) {
                 mn = a[r];
                 a[r] = a[l];
                 a[l] = mn;
                 }
        return;
    }
    int m = (r + l) / 2;
    merge(l, m);
    merge(m + 1, r);
    int buf[100000];
    int xl = l;
    int xr = m + 1;
    int cur = 0;
    while (r - l + 1 != cur) {
        if (xl > m)
            buf[cur++] = a[xr++];
        else if (xr > r)
            buf[cur++] = a[xl++];
        else if (a[xl] > a[xr])
            buf[cur++] = a[xr++];
        else buf[cur++] = a[xl++];
 
    }
    for (int i = 0; i < cur; i++)
        a[i + l] = buf[i];
}
 
int main() {
 
    int F, L, b[100000], c[100000], k = 0, i = 0, f = 0, j, min = 0, mn = 0;
    FILE *fp, *mp;
    fp = fopen("merge.dat", "r");
    fscanf(fp, "%d", &F);
    for(k = 0; k < F; k++) {
        fscanf(fp, "%d", &a[k]);
    }
    fscanf(fp, "%d", &L);
    for(i = 0; i < L; i++) {
        fscanf(fp, "%d", &b[i]);
    }
    fclose(fp);
 
    while(F > 0) {
        c[f] = a[k];
        k++;
        f++;
        F--;
    }
    while(L > 0) {
        c[f] = b[i];
        i++;
        f++;
        L--;
    }
    merge(0, f - 1);
    mp = fopen("merge.dat", "w");
    for(i = 0; i < f; i++) {
        fprintf(mp, "%d\n", c[i]);
    }
    fclose(mp);
    return 0;
}
Помогите найти ошибку.

Решение задачи: «Построить дуболомов в одну шеренгу но так, чтобы они опять были расположены по росту от самого высокого к самому низкому»

textual
Листинг программы
#include <stdio.h>
 
#define SIZE_A (4)
#define SIZE_B (5)
#define SIZE_C ( SIZE_A + SIZE_B )
 
int main(void) {
    int arrA[SIZE_A] = { 8, 5, 4, 2 }, arrB[SIZE_B] = { 9, 7, 6, 3, 1 }, arrC[SIZE_C], iA, iB, iC;
    
    for ( iA = iB = iC = 0; iC < SIZE_C; ++iC ) {
        if ( iA < SIZE_A ) {
            if ( iB < SIZE_B ) {
                if ( arrA[iA] > arrB[iB] )
                    arrC[iC] = arrA[iA++];
                else
                    arrC[iC] = arrB[iB++];
            }
            else
                arrC[iC] = arrA[iA++];
        }
        else
            arrC[iC] = arrB[iB++];
    }
    
    for ( iC = 0; iC < SIZE_C; ++iC )
        printf("%d ", arrC[iC]);
    
    printf("\n");
    
    return 0;
}

Объяснение кода листинга программы

В этом коде задача состоит в том, чтобы построить массив arrC, который будет содержать дуболомов, расположенных в шеренге по росту от самого высокого к самому низкому. Для этого используются три массива: arrA, arrB и arrC. Массив arrA содержит четыре дуболома, массив arrB содержит пять дуболомов, а массив arrC должен будет содержать девять дуболомов после выполнения программы. В первой строке кода объявляются три массива и инициализируются значениями соответствующих размеров. Далее в цикле for происходит процесс заполнения массива arrC. В каждой итерации цикла проверяется, что еще есть дуболомы в массивах arrA и arrB. Если дуболомы в массиве arrA больше, чем в массиве arrB, то выбирается самый высокий дуболом из массива arrA и помещается в массив arrC. Если дуболомы в массиве arrB больше, чем в массиве arrA, то выбирается самый высокий дуболом из массива arrB и помещается в массив arrC. Если дуболомы закончились в массиве arrA, то выбирается самый высокий дуболом из массива arrB и помещается в массив arrC. Если дуболомы закончились в массиве arrB, то выбирается самый высокий дуболом из массива arrA и помещается в массив arrC. После заполнения массива arrC, происходит вывод его содержимого на экран. Этот код можно оптимизировать, если вместо проверки, что дуболомы закончились в массивах arrA и arrB, использовать счетчик, который будет отслеживать количество использованных дуболомов в каждом массиве.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы