Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Задача на слияние  (Прочитано 5783 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
MahovIV
Новенький

ua
Offline Offline

« : 01-01-2014 12:51 » 

Помогите решить задачу.
 Имя входного файла: 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 чисел, идущих в невозрастающем порядке. Каждое число — это рост соответствующего дуболома из первой или из второй шеренги. Каждое число должно выводиться в отдельную строку.
 Программа выглядит так.
Код:
#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;
}
Покажите правильно работающий вариант.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 01-01-2014 16:53 » 

Правильно работающий алгоритм будет содержать общий цикл по обеим шеренгам и управление индексами обхода шеренг по условиям, которые нужно тебе обдумать.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
MahovIV
Новенький

ua
Offline Offline

« Ответ #2 : 01-01-2014 20:00 » 

Покажите на примере.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-01-2014 21:11 » 

MahovIV, вот тебе лень головой думать и учиться, а мне лень примеры писать. Раз преподаватель дал такое задание, значит предполагается, что либо ты должен быть способен с ним справиться, либо это "бонусное" задание для самых продвинутых, не влияющее в худшую сторону на оценку.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 05-01-2014 22:07 » new

Объединение двух отсортированных интервалов. Например, в STL уже есть функция слияния.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines