Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 8
1

Интересная Олимпиадная Задача

11.07.2012, 20:34. Показов 2206. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Удалить из одномерного массива наименьшее количество элементов так, что бы оставшиеся элементы возрастали
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2012, 20:34
Ответы с готовыми решениями:

Олимпиадная задача №4
Захар любит игры со словами. Но играть одному не интересно, поэтому Захар подсадил на эти игры...

Олимпиадная задача
Здравствуйте! Хотел бы попросить помощи в поиске ошибок моего алгоритма. Если кто либо найдёт...

Олимпиадная задача
Дошел до этой олимпиадной задачи и впал в ступор. Нагуглил, что можно решить с помощью матриц, либо...

Олимпиадная задача
Доброго времени суток. Я иду на городскую олимпиаду по информатике. Естественно, там будут...

17
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
11.07.2012, 23:48 2
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
INPUT "vvedite kolichestvo elementov N ", n
DIM a(n)
FOR i = 1 TO n
INPUT "vvedite element ", a(i)
NEXT
PRINT "massiv"
FOR i = 1 TO n
PRINT a(i);
NEXT
PRINT
max = 1
nach = 1
FOR i = 1 TO n - 1
min = a(i)
kol = 1
FOR j = i + 1 TO n
IF a(j) > min THEN
min = a(j)
kol = kol + 1
IF kol > max THEN max = kol: nach = i
END IF
NEXT
NEXT
'PRINT max; nach
PRINT a(nach);
t = a(nach)
FOR i = nach + 1 TO n
IF a(i) > t THEN PRINT a(i); : t = a(i)
NEXT
2
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 8
12.07.2012, 23:21  [ТС] 3
Помоему, так можно некоторую комбинацию пропустить))
Я Думаю сделать бинарным методом, так точно ничего не проспутишь
Но проблема в том, что если будет много элементов, то очень большое количество комбинаций выходит !

Добавлено через 7 минут
Ии я не совсем понел как работает ваш код ! Если можно, распишите ,пожалуйсто , ваш Алгоритм !
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
13.07.2012, 00:45 4
Интересно, какую это комбинацию я пропустил, если у меня полный перебор?
А алгоритм перед вами. Раз вы так уверенно заявляете, что в моём алгоритме есть дыра, значит, можете разобраться в нём.
Ничего нового. Перебираем все варианты возрастающих последовательностей данного массива, выбираем самую длинную, откидываем лишние элементы, не входящие в данную последовательность.
0
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 8
13.07.2012, 12:42  [ТС] 5
Просто я не доконца его понел. Незнаю, такая мысль возникла )) я потом еще раз пересмотрел, большую часть понел, но все равно все еще не ясно как именно.
Если незатруднит, распишите алгоритм подробнее)
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
13.07.2012, 13:16 6
Не нанимался я неучей учить, разбирайтесь сами, раз взялись за олимпиадные задачи, иначе толка не будет. Мне никто ничего не объяснял, может, потому и могу кое-что.
Всё в программе. Там ничего сложного.
0
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 8
13.07.2012, 20:48  [ТС] 7
Да все все успокойтесь))) я все понел)) я тоже так делал, только я в конце не выводил нужные, а удалял просто их, с чем возинкали проблемы (из двух чисел нужно было удалить нужное)
Спасибо большое!!)) И да, я не неуч)

Добавлено через 1 час 6 минут
Не работает ваша прогамма. В Комбинации 7,1,4,5,9,6,7,8,3,2,10 она удаляет сначало 6, потом 7, потом 8, потом 3, потом 2. А должна была удалить только девятку,тройку и двойку) Я не зря задал вопрос, будь это программа такой легкой, я бы не создавал эту тему. Я сделал бинарным перебором, но она довольно долго работает для больших чисел, врятли это рационально !
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
13.07.2012, 23:08 8
Да, вы правы. есть тонкости, которые я не учёл, но они устранимы.
0
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 8
14.07.2012, 17:01  [ТС] 9
Я пытался их устронять, выходило, что в одном случае программа работает нормально, а вдругом опять удаляет то, что не нужно (
0
5000 / 1672 / 409
Регистрация: 25.04.2010
Сообщений: 4,619
Записей в блоге: 2
15.07.2012, 11:19 10
А должна была удалить только девятку,тройку и двойку)
А 7 что не подпадает под "оставшиеся элементы"?
Цитирую ваше условие задачи:
Удалить из одномерного массива наименьшее количество элементов так, что бы оставшиеся элементы возрастали
Добавлено через 1 час 3 минуты
Enies Lobby, на каких тестовых данных тестируется эталон?
Т.е. такие данные должны быть. Это очень важно. Кроме каких-то очевидных ситуаций,
которые программа обязана считать, должны быть "особые" данные выявляющие
несоответствие алгоритма условию, выложите их если они у вас есть.
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
15.07.2012, 11:58 11
>Quiet Snow< , он прав. Моя программа не учитывает такие последовательности, как, к примеру:

1 2 10 3 4

она найдёт 1 2 10, а надо 1 2 3 4
0
5000 / 1672 / 409
Регистрация: 25.04.2010
Сообщений: 4,619
Записей в блоге: 2
15.07.2012, 12:27 12
>Quiet Snow< , он прав.
Да дело не в твоей программе, я тему читал. Просто, если кто возьмётся делать прогу
может возникнуть ситуация, что она так же не учтёт определённые вещи.
Поэтому ты и не мог проверить работу своей программы. А то иметь полный бинарный перебор
и каждый раз проверять по 20-30 раз разными комбинациями + не быть уверенным, что программа
работает тоже как-то не очень...
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
15.07.2012, 18:36 13
Enies Lobby, большие последовательности - это какие.
Напишите пример оной и какое время у Вас получилось?

Какой минимальный шаг - целые числа или могут быть и дробные ???
0
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 8
15.07.2012, 23:16  [ТС] 14
Эмм Все числа натуральные, количество всех чисел не превышает 10 000.
Комбинация 7,1,4,5,9,6,7,8,3,2,10 наиболее показательна, здесь основная загвоздка, подобных пока не нашел.
Я вот как сделал:
если n - это количество элементов, то открываю цикл от 1 до 2^n (Сами понимаете, 2 в десятой степени совсем не маленькое число)
Далее перевожу его в двоичную систему, добавляю нули в начале ( дополняю размер комбинации до n).
Проверяю, если 0 - то элемент в комбинации не учитывается, если 1 - то учитывается.
Запоминая комбинацию, выбираю наиболее рациональную.
но она оооооооооооооооочень долго работает
0
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
16.07.2012, 13:16 15
по бинарному алгоритму (перебирая все возможные комбинации):
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
DATA 7,1,4,5,9,6,7,8,3,2,10
DIM n AS LONG, i AS LONG, j AS LONG, k AS LONG
DIM iCnt AS LONG, max AS LONG, iMax AS LONG, maxCnt AS LONG
 
n = 11
DIM a(1 TO n) AS LONG
FOR i = 1 TO n: READ a(i): NEXT i
 
FOR i = 1 TO 2 ^ n - 1
    j = i
    k = 0
    iCnt = 0
    max = 0
    DO
        k = k + 1
        IF j MOD 2 THEN
            iCnt = iCnt + 1
            IF a(k) > max THEN max = a(k) ELSE EXIT DO
        END IF
        j = j \ 2
    LOOP WHILE j > 0
    IF j = 0 AND iCnt > maxCnt THEN maxCnt = iCnt: iMax = i
NEXT i
 
j = iMax
FOR i = 1 TO n
    IF j MOD 2 THEN PRINT a(i);
    j = j \ 2
NEXT i
PRINT
В принципе не так уж и долго, перебрать 20 чисел потребуется меньше минуты (секунд 10-20)

Альтернативный алгоритм:
проверяем массив на возрастание, затем поочередно исключаем из массива вначале 1 элемент (n комбинаций), затем 2 элемента (n*(n-1)/2 комбинаций), 3 элемента - n*(n-1)*(n-2)/6 комбинаций, 4 элемента и т.д. каждый раз проверяя массив на возрастание, первая попавшаяся комбинация даст искомое решение, при этом не нужно будет проверять все n^2 комбинаций, это случится только если массив отсортирован по убыванию

для предложенных 11 чисел, необходимо будет проверить максимум 1+11+55+165+330=562 комбинаций

Добавлено через 9 часов 20 минут
Постараюсь реализовать вышеупомянутый алгоритм на VBA (в нем легче сделать отладку и больше возможностей), если получится, то можно будет и на QBasic перевести

Добавлено через 2 часа 24 минуты
вариант на VBA, на QBasic пока нет времени перевести:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Option Explicit
Public aArr&() 'массив для чисел
Public bArr() As Boolean 'массив исключаемых чисел
Sub www()
    Dim x 'временная переменная для инициализации массива
    Dim a&(), i&, k&, n&, p&, j&
    'a()- массив для комбинаций
    'i  - счетчик циклов
    'k  - количество извлекаемых чисел
    'n  - всего чисел
    'p  - вспомогательная переменная для хранения текущей позиции
    'j  - счетчик комбинаций
    
    'заносим исходные данные в массив aArr()
    For Each x In Array(7, 1, 4, 5, 9, 6, 7, 8, 3, 2, 10)
        n = n + 1
        ReDim Preserve aArr&(1 To n)
        aArr(n) = x
    Next x
    ReDim bArr(1 To n) As Boolean 'переопределяем размерность массива исключений bArr()
    
    If check() Then Call printArr: Exit Sub 'проверяем исходный массив, в случае успеха выводим результат
    
    For k = 1 To n - 1 'перебираем исключения от 1 до n-1
        ReDim a(1 To k) 'переопределяем массив от 1 до k
        p = k 'инициализируем переменную p
        For i = 1 To k: a(i) = i: Next i 'формируем массив a() начальными значениями
 
        Do
            j = j + 1 'увеличиваем счетчик комбинаций
            ReDim bArr(1 To n) As Boolean 'очищаем массив
            For i = 1 To k: bArr(a(i)) = True: Next i 'формируем массив исключаемых чисел
            If check() Then 'проверяем на возрастание
                Call printArr 'выводим на печать
                Debug.Print "Количество перебранных комбинаций:"; j
                Exit Sub
            End If
            
            If p = 0 Then Exit Do 'если комбинации закончились, то выходим из цикла
            For i = k To p Step -1 'обновляем очередную комбинацию
                a(i) = a(p) + i - p + 1
            Next i
            If a(k) = n Then p = p - 1 Else p = k
        Loop
    Next k
End Sub
 
Function check() As Boolean 'функция проверки массива на возрастание, за исключением чисел указанных признаком в bArr()
    Dim i As Long, maxArr As Long
    For i = LBound(aArr) To UBound(aArr)
        If Not bArr(i) Then
            If aArr(i) > maxArr Then maxArr = aArr(i) Else Exit Function
        End If
    Next i
    check = True
End Function
 
Sub printArr() 'процедура вывода на печать массива
    Dim i As Long
    For i = LBound(aArr) To UBound(aArr)
        If Not bArr(i) Then Debug.Print aArr(i);
    Next i
    Debug.Print
End Sub
Добавлено через 54 минуты
собственно на QBasic:

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
DECLARE SUB printArr ()
DECLARE FUNCTION check% ()
DATA 7, 1, 4, 5, 9, 6, 7, 8, 3, 2, 10
DIM SHARED n AS LONG
n = 11
DIM SHARED aArr(1 TO n) AS LONG
DIM SHARED bArr(1 TO n) AS INTEGER
 
 
DIM a(1 TO n) AS LONG, i AS LONG, k AS LONG, p  AS LONG, j AS LONG
 
FOR i = 1 TO n: READ aArr(i): NEXT i
   
CLS
PRINT "Array:": CALL printArr
PRINT "New array:"
IF check = 1 THEN CALL printArr: END
 
FOR k = 1 TO n - 1
    REDIM a(1 TO k) AS LONG
    p = k
    FOR i = 1 TO k: a(i) = i: NEXT i
    DO
        j = j + 1
        REDIM bArr(1 TO n) AS INTEGER
        FOR i = 1 TO k: bArr(a(i)) = 1: NEXT i
        IF check = 1 THEN
        CALL printArr
        PRINT "kol-vo combyn:"; j
        END
        END IF
        
        IF p = 0 THEN EXIT DO
        FOR i = k TO p STEP -1
        a(i) = a(p) + i - p + 1
        NEXT i
        IF a(k) = n THEN p = p - 1 ELSE p = k
    LOOP
NEXT k
 
FUNCTION check%
    DIM i AS LONG, maxArr AS LONG
    FOR i = 1 TO n
    IF bArr(i) = 0 THEN
        IF aArr(i) > maxArr THEN maxArr = aArr(i) ELSE EXIT FUNCTION
    END IF
    NEXT i
    check = 1
END FUNCTION
 
SUB printArr
    DIM i AS LONG
    FOR i = 1 TO n
    IF bArr(i) = 0 THEN PRINT aArr(i);
    NEXT i
    PRINT
END SUB
2
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
16.07.2012, 19:48 16
разбор данной задачи есть в книге: Ф. В. Меньшиков. "Олимпиадные задачи по программированию"
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
INPUT n
DIM a(n), b(n)
FOR i = 1 TO n
    INPUT a(i)
NEXT
FOR i = 1 TO n
    q = 0
    FOR j = 1 TO i - 1
        IF a(j) <= a(i) AND b(j) > q THEN q = b(j)
    NEXT
    b(i) = q + 1
    IF b(i) > max THEN max = b(i): c = i
NEXT
size = max
DIM r(size)
FOR i = c TO 1 STEP -1
    IF b(i) = max THEN r(max) = a(i): max = max - 1
NEXT
FOR i = 1 TO size
    PRINT r(i);
NEXT
2
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
17.07.2012, 01:48 17
Цитата Сообщение от softmob Посмотреть сообщение
разбор данной задачи есть в книге: Ф. В. Меньшиков. "Олимпиадные задачи по программированию"
Скачал данную книгу, очень занимательная, и задачки не слабые, интересно самому прорешать без подсказок
0
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 8
18.07.2012, 18:37  [ТС] 18
Цитата Сообщение от softmob Посмотреть сообщение
разбор данной задачи есть в книге: Ф. В. Меньшиков. "Олимпиадные задачи по программированию"
Вуй вот круто то а) я тож скачал книгу, осталось только разобраться, пока не совсем получается)

Добавлено через 6 часов 34 минуты
Все я разобрался ! Всем спасибо ! Жаль что сам не догодался (
0
18.07.2012, 18:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2012, 18:37
Помогаю со студенческими работами здесь

Задача на дп (олимпиадная)
Здравствуйте, имеется данная задача, основная проблема состоит в том, что мое решение никак не...

Олимпиадная задача
Задание 1. Написать и отладить программу, выполняющую задание. Подпрограмма должна быть...

Олимпиадная задача
Был в прошлом году на олимпиаде по программированию и там была такая задача: После запуска...

Олимпиадная задача
Доброго времени суток! Есть задача, которую я приложил в текстовом документе. Сюда я ее не скинул...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru