|
У меня еще одна простая задачка для любителей алгоритмов | ☑ | ||
---|---|---|---|---|
0
Простенький вопросик
11.05.12
✎
16:13
|
Есть неупорядоченный массив из различных чисел от 0 до х, необходимо за один цикл найти недостающее число.
Кто может на 8ке быстро код написать? |
|||
1
Простенький вопросик
11.05.12
✎
16:15
|
различных целых чисел
|
|||
2
Fragster
гуру
11.05.12
✎
16:16
|
могу в запросе
|
|||
3
pumbaEO
11.05.12
✎
16:16
|
с кем ЗП поделишься, тот и напишет.
|
|||
4
salvator
11.05.12
✎
16:16
|
(0) У самого ноль вариантов?
|
|||
5
Простенький вопросик
11.05.12
✎
16:17
|
не, надо именно в цикле. В запросе или через функции и я могу.
|
|||
6
Fragster
гуру
11.05.12
✎
16:17
|
Массив.Найти (Array.Find)
Массив (Array) Найти (Find) Синтаксис: Найти(<Значение>) Параметры: <Значение> (необязательный) Тип: Произвольный. Искомое значение. Возвращаемое значение: Тип: Число, Неопределено. Если элемент найден, возвращается его порядковый номер. Если элемент не найден, возвращается Неопределено. Описание: Выполняет поиск элемента в массиве. Возможен обмен с сервером. Сериализуется. |
|||
7
Простенький вопросик
11.05.12
✎
16:18
|
(4)
Ну я пока над другими работаю, чето это задачка застряла. Ну за час решил бы и сам наверно, просто срочно надо. |
|||
8
Fragster
гуру
11.05.12
✎
16:18
|
Сч = 0;
Пока Массив.Найти(Сч) <> Неопределено Цикл Сч = Сч + 1; КонецЦикла; Сообщить(Сч) |
|||
9
mirosh
11.05.12
✎
16:18
|
если
a[i] - a[i-1] > 1 так что ли? |
|||
10
Ненавижу 1С
гуру
11.05.12
✎
16:19
|
ПолнаяСумма = Х*(Х+1)/2;
НеполнаяСумма = 0; Для каждого Эл из Массив Цикл НеполнаяСумма = НеполнаяСумма + Эл; КонецЦикла; Пропущено = ПолнаяСумма - НеполнаяСумма ; |
|||
11
mirosh
11.05.12
✎
16:19
|
(9) а, неупорядоченный
|
|||
12
andrewks
11.05.12
✎
16:19
|
а что значит "недостающее"?
|
|||
13
andrewks
11.05.12
✎
16:20
|
0 5 8 80
какое число тут недостающее? |
|||
14
andrewks
11.05.12
✎
16:21
|
(10) это что?
|
|||
15
salvator
11.05.12
✎
16:22
|
(13) Думаю, ТС хочет найти 1,2,3,4,6,7,9,10 и т.д.
|
|||
16
Ненавижу 1С
гуру
11.05.12
✎
16:22
|
(12) перевожу автора: есть массив целых от 0 до Х, одно число из него удалали, а оставшиеся перемешали, найти удаленное число, зная Х
|
|||
17
andrewks
11.05.12
✎
16:22
|
(15) в том-то и дело, что непонятно, чего хочет ТС
|
|||
18
pumbaEO
11.05.12
✎
16:22
|
(13) +100 или там еще последовательность надо найти. -1 -50 0 25 6 какое недостающие?
|
|||
19
Ненавижу 1С
гуру
11.05.12
✎
16:22
|
(14) решение задачи ))
|
|||
20
andrewks
11.05.12
✎
16:23
|
(19) которую ты сам придумал? ;-)
|
|||
21
Ненавижу 1С
гуру
11.05.12
✎
16:24
|
(20) нет)) эта известная задача, постоянно кочует по собеседованиям
|
|||
22
andrewks
11.05.12
✎
16:24
|
(16) при такой формулировке не найдёшь
пусть Х = 100 был массив 0 9 15 67 80 я удалил отсюда 9 ну-ка, как ты его вычислишь? |
|||
23
andrewks
11.05.12
✎
16:24
|
(21) тогда давай корректное её условие
|
|||
24
Mikeware
11.05.12
✎
16:25
|
(21) Это же из Вирта, вроде? :-)
|
|||
25
andrewks
11.05.12
✎
16:26
|
наверное, где-то в условии должно фигурировать слово "непрерывная", не?
|
|||
26
Простенький вопросик
11.05.12
✎
16:26
|
(10)
чето не совсем понятно |
|||
27
andrewks
11.05.12
✎
16:27
|
(26) корректное условие задачи будет? или ветку для телепатов завёл?
|
|||
28
Простенький вопросик
11.05.12
✎
16:27
|
(22)
я думаю, что поставновщиу подразумевает, что числа шли в последовательности типа 1,2,3,4,5. потом удалили например 4 и перемешали. Как найти 4. |
|||
29
pumbaEO
11.05.12
✎
16:27
|
-3,-2,-1,0,1 (10) решит?
|
|||
30
Простенький вопросик
11.05.12
✎
16:28
|
(27)
ну вот как сформулирована, так и выложил, предположение в 28 |
|||
31
Ненавижу 1С
гуру
11.05.12
✎
16:29
|
итак, еще версия: есть массив целых от 0 до Х (каждое встречается ровно один раз!), одно число из него удалили, а оставшиеся перемешали, найти удаленное число, зная Х
кстати в (0) вполне корректно |
|||
32
Ненавижу 1С
гуру
11.05.12
✎
16:30
|
(26) непонятно - значит не твое
сначала без цикла находим сумму всех чисел без удаленного, потом циклом суммируем оставшиеся удаленное будет разницей между ними |
|||
33
pumbaEO
11.05.12
✎
16:31
|
(31) натуральных чисел или PI допускается?
|
|||
34
azernot
11.05.12
✎
16:31
|
(29) В условии от 0 до Х.. Вряд ли имеется в виду отрицательный Х. Скорее вмего имеется в виду натуральный ряд.
Имхо, самое красивое решение в (8).. |
|||
35
sash-ml
11.05.12
✎
16:31
|
(10) + Х = Массив.Количество()+1;
|
|||
36
Ненавижу 1С
гуру
11.05.12
✎
16:32
|
(33) ты видишь в (31) есть слово "целых"? я вижу
|
|||
37
jumper
11.05.12
✎
16:32
|
(26)
Сумма арифметической прогрессии |
|||
38
Ненавижу 1С
гуру
11.05.12
✎
16:33
|
(35) метод Найти сам по себе реализован через цикл
|
|||
39
Fragster
гуру
11.05.12
✎
16:33
|
(38) нет, там с помощью духа нуралиева ищется!
|
|||
40
Ненавижу 1С
гуру
11.05.12
✎
16:34
|
(39) потому признайте, что (10) круче ))
|
|||
41
Простенький вопросик
11.05.12
✎
16:35
|
А теперь понял, (10) похоже на правду, в нескольких вариантах сработало.
|
|||
42
sash-ml
11.05.12
✎
16:36
|
(40) (35) + (10) самое оно
|
|||
43
Mikeware
11.05.12
✎
16:36
|
(40) применять мозги - всегда круче...
|
|||
44
Fragster
гуру
11.05.12
✎
16:36
|
(40) ну, никто не спорит, что если ты помнишь формулу арифметической последовательности, то ты крут!
|
|||
45
salvator
11.05.12
✎
16:36
|
(34) Перед этим еще массив отсортировать надо...
|
|||
46
Fragster
гуру
11.05.12
✎
16:36
|
*суммы
|
|||
47
Fragster
гуру
11.05.12
✎
16:37
|
(45) перед (8) сортировать не надо
|
|||
48
Ненавижу 1С
гуру
11.05.12
✎
16:37
|
(44) да она мне снится по ночам ))
|
|||
49
salvator
11.05.12
✎
16:38
|
Хотя не, в этом случае необязательно
|
|||
50
n koretsky
11.05.12
✎
16:38
|
детская задачка.
сумма чисел от минимума массива до максимума минус сумма чисел массива = недостающее число. но ТС неверно написал задачу, оттого и нафлудили :) |
|||
51
Mikeware
11.05.12
✎
16:40
|
(44) вывести можно.
|
|||
52
Ненавижу 1С
гуру
11.05.12
✎
16:40
|
(50) я тут несколько раз корректно формулировал математические задачи - флудить, однако, никому это не мешало ))
|
|||
53
sda553
11.05.12
✎
16:42
|
Если число всего одно, то можно решить вот так:
Ф=0; З=0; Для сч=0 По Х Цикл Ф=Ф+Массив[сч]; З=З+сч; КонецЦикла; НедостающееЧисло = З-Ф; |
|||
54
andrewks
11.05.12
✎
16:43
|
(40) можно ещё круче
|
|||
55
sda553
11.05.12
✎
16:44
|
(53) А ну да, в (10) уже было, там более правильно чем в 53
|
|||
56
andrewks
11.05.12
✎
16:44
|
(53) да, примерно так. только слишком много переменных
|
|||
57
Mikeware
11.05.12
✎
16:44
|
(53) А кто сказал, что диапазон от 0 до Х ?
|
|||
58
sda553
11.05.12
✎
16:45
|
(57) ТС в (0) . Нет?
|
|||
59
andrewks
11.05.12
✎
16:45
|
|
|||
60
Reset
11.05.12
✎
16:46
|
// оптимизировал (10) на 2 строки ;-))
Игрек = Х*(Х+1)/2; Для каждого Эл из Массив Цикл Игрек = Игрек - Эл; КонецЦикла; // В Игрек - искомое значение |
|||
61
Mikeware
11.05.12
✎
16:48
|
(58) А, ну тогда да... Я просто привык решать задачки в общем виде
|
|||
62
Infsams654
11.05.12
✎
16:49
|
(10)(53)(60), а если несколько пропущено, тогда ПолнаяСумма - НеполнаяСумма может и присутствовать в последовательности, т.к. это сумма нескольких пропущенных чмсел
|
|||
63
Lama12
11.05.12
✎
16:49
|
(0)В каком классе арифметическую последовательность проходят?
|
|||
64
Lama12
11.05.12
✎
16:50
|
(0)В хоменет что ль на работу устраиваешься?
|
|||
65
Reset
11.05.12
✎
16:50
|
(62) Если будет пропущено несколько - это будет другая история и другое решение
|
|||
66
Ненавижу 1С
гуру
11.05.12
✎
16:52
|
(63) в 7 классе
|
|||
67
BiBijke
11.05.12
✎
16:52
|
(40) Ваш метод не работает для отрицательных чисел.
|
|||
68
andrewks
11.05.12
✎
16:53
|
(67) в условии нет отриц.чисел
|
|||
69
BiBijke
11.05.12
✎
16:54
|
(68) Где в условии сказано что x > 0 ?
|
|||
70
pumbaEO
11.05.12
✎
16:54
|
(68) в условии есть [массив из различных чисел]
|
|||
71
Ненавижу 1С
гуру
11.05.12
✎
16:54
|
(67) сколько же оленеводов у нас в тайге еще не учтенных
ну прости уж )) |
|||
72
Ненавижу 1С
гуру
11.05.12
✎
16:55
|
(69) что такое от 0 до -2 ?
|
|||
73
andrewks
11.05.12
✎
16:55
|
(70) а, то про то, что не указано явно, что х>0?
|
|||
74
Reset
11.05.12
✎
16:55
|
(67) Работает
|
|||
75
Ненавижу 1С
гуру
11.05.12
✎
16:55
|
+(72) даже циклы так не работают:
Для й=0 по -2 Цикл |
|||
76
Mikeware
11.05.12
✎
16:55
|
(49) ПолнаяСумма=(МинЧисло+МаксЧисло)*КоличествоЧисел/2
КоличествоЧисел - на единицу больше размера массива. минимум, максимум и реальная сумма считаются в цикле запросто |
|||
77
andrewks
11.05.12
✎
16:56
|
(72) последовательность убывающих целых чисел, например
|
|||
78
Ненавижу 1С
гуру
11.05.12
✎
16:56
|
я в (31) сформулировал более строго условие
|
|||
79
Reset
11.05.12
✎
16:56
|
+(74) Не работает, если вы последовательность от 0 дло -10 (уже криво) понимаете как содержащую положительные числа
|
|||
80
Mikeware
11.05.12
✎
16:56
|
(77) арифметическая прогрессия с отрицательным шагом
|
|||
81
Ненавижу 1С
гуру
11.05.12
✎
16:57
|
(77) не бывает интервала (0;-2)
|
|||
82
BiBijke
11.05.12
✎
16:57
|
(75) причем тут массив чисел и вот эта строчка :
Для й=0 по -2 Цикл она к чему тут вообще?) |
|||
83
andrewks
11.05.12
✎
16:57
|
(81) интервал - это уже вещественные числа. тебя не в ту степь понесло
|
|||
84
andrewks
11.05.12
✎
16:58
|
речь за последовательность, а не интервал
|
|||
85
Ненавижу 1С
гуру
11.05.12
✎
16:58
|
(83) да какая разница то? ну рассмотри только на целых
|
|||
86
andrewks
11.05.12
✎
16:58
|
а последовательность может быть любая, в принципе
например, 7 10 -1 pi/2 i |
|||
87
andrewks
11.05.12
✎
16:59
|
(85) большая
|
|||
88
Reset
11.05.12
✎
16:59
|
(82) не при чем!
Его метод работает как для 0...10 так и для -10...0 в (67) поклеп! |
|||
89
BiBijke
11.05.12
✎
17:02
|
(88) 0 -1 -2 Пропущено -1
ПолнаяСумма = -2 * (-1)/2 = 1 Сумма элементов = -2 Полная - Неполная = 1 - - 2= 3 и где ето работает? |
|||
90
Reset
11.05.12
✎
17:05
|
Ну довернуть формулу ПолнаяСумма = Х*(Х+1)/2*?(X<0,-1,1);
раз уж из пальца высосали отрицательные числа |
|||
91
Reset
11.05.12
✎
17:05
|
Метод корректен
|
|||
92
BiBijke
11.05.12
✎
17:05
|
(90) Да почему из пальца, какое ТЗ дали, от того и отталкиваемся
|
|||
93
Ненавижу 1С
гуру
11.05.12
✎
17:06
|
ептель, в условии нет никакой арифметической последовательности, есть массив чисел, значения лежат на от резке от 0 до Х, так вот когда Х<0 условие просто некорректно
|
|||
94
Cmyk32
11.05.12
✎
17:06
|
В список значений преобразовать можно?)))
|
|||
95
andrewks
11.05.12
✎
17:07
|
(93)
массив = посл-ть массив != интервал |
|||
96
andrewks
11.05.12
✎
17:08
|
+(95) конечная последовательность
|
|||
97
BiBijke
11.05.12
✎
17:09
|
(93) Да что вы заладили некорректно, да некорректно. Есть условие массив чисел, где там слово про отрезок или последовательность есть ?
Дососали условие из пальца ) |
|||
98
Ardi
11.05.12
✎
17:12
|
(10)
"ПолнаяСумма = Х*(Х+1)/2; НеполнаяСумма = 0; Для каждого Эл из Массив Цикл НеполнаяСумма = НеполнаяСумма + Эл; КонецЦикла; Пропущено = ПолнаяСумма - НеполнаяСумма ;" Я когда-то ходил на собеседование в Аббии - там одна такая задача была. Я её именно так и решил (По образованию бухгалтер). Но меня в Аббии кадровик всё равно не взял. |
|||
99
Mikeware
11.05.12
✎
17:14
|
(89) см (76).
|
|||
100
BiBijke
11.05.12
✎
17:17
|
(99) так я не спорю что у вас верная формула, просто жду когда (10) признает, что он не прав )
|
|||
101
andrewks
11.05.12
✎
17:17
|
дано:
есть массив (конечная последовательность), состоящая из целых неотрицательных чисел a размерности n известно, что для i>1 a[i] = a[i-1] + a[i-2] a[0], a[1] - неизвестны из данного массива удалили один элемент (известно лишь, что это не a[0] и не a[1]) и перемешали оставшиеся элементы произвольным образом вопрос: возможно ли в одном цикле выяснить, какое число (элемент) было удалено? приведите алгоритм |
|||
102
Толич
11.05.12
✎
17:18
|
В (8) верное решение если значения натуральные и не отрицательные.
|
|||
103
Mikeware
11.05.12
✎
17:22
|
(101) а[1] могли удалить. Не могли - последний
|
|||
104
Ненавижу 1С
гуру
11.05.12
✎
17:22
|
ептыть, ну не бывает фразы "массив из различных чисел от 0 до -5", ну бред это!
|
|||
105
andrewks
11.05.12
✎
17:23
|
(103) это почему?
|
|||
106
Ненавижу 1С
гуру
11.05.12
✎
17:24
|
(95) вообще говоря
массив != посл-ть если уж быть таким... |
|||
107
andrewks
11.05.12
✎
17:24
|
(103) а, в смысле, усложняешь? :)
|
|||
108
andrewks
11.05.12
✎
17:24
|
(106) см. поправку
|
|||
109
Mikeware
11.05.12
✎
17:25
|
(105) потому, что удалить могли только из середины последовательности. Иначе задача имеет два решения - предудущий член перед минимальным, и последующий после максимального
|
|||
110
Mikeware
11.05.12
✎
17:25
|
(100) он тоже прав, для более строгих условий
|
|||
111
BiBijke
11.05.12
✎
17:25
|
(104) Вы наверное путаете индексы массива и значения в нем. В случае массив чисел от 0 до -5 говорит о порядке расположения элементов в массиве, т. е. [0] элемент = 0, 5 элемент равен -5.
|
|||
112
Mikeware
11.05.12
✎
17:26
|
(104) фраза "массив из чисел" - тоже не ахти...
|
|||
113
BiBijke
11.05.12
✎
17:26
|
(100) Вот опять, есть ТЗ. Под ТЗ (0) его алгоритм не подходит, и не важны всякие если бы да кабы.
|
|||
114
Ненавижу 1С
гуру
11.05.12
✎
17:26
|
(111) пипец, я в шоке
|
|||
115
BiBijke
11.05.12
✎
17:27
|
(112) вы о чем??)
|
|||
116
andrewks
11.05.12
✎
17:28
|
(109) задача в моей формулировке имеет одно решение, насколько я вижу.
|
|||
117
Ненавижу 1С
гуру
11.05.12
✎
17:29
|
(101) a[i] = a[i-1] + a[i-2]
это последовательность Фибоначи? |
|||
118
Mikeware
11.05.12
✎
17:30
|
(116) если массив имеет числа 2,3,4,5 - "пропущено" либо ничего (а по условиям задачи такое не допускается), либо 1 или 6
|
|||
119
andrewks
11.05.12
✎
17:31
|
(118) не может быть такого массива по условию
|
|||
120
Mikeware
11.05.12
✎
17:31
|
(115) фраза кривая. массив, он сам по себе массив. он может быть заполнен числами. Но не "состоять из..."
|
|||
121
Ненавижу 1С
гуру
11.05.12
✎
17:31
|
Когда математик говорит, что число Х раположено между А и Б, он подразумевает это фразой неравенство
А<=Х<=Б |
|||
122
Ненавижу 1С
гуру
11.05.12
✎
17:32
|
давайте подумаем что такое массив? ))
|
|||
123
andrewks
11.05.12
✎
17:32
|
(117) нет, Фибоначчи :)
|
|||
124
Ненавижу 1С
гуру
11.05.12
✎
17:32
|
(123) точно))
|
|||
125
Mikeware
11.05.12
✎
17:33
|
(119) о чем я тебе и говорю - а[1] может быть пропущен, если у тебя индексы начинаются с 0, не могут - а[0] и а[n]
|
|||
126
andrewks
11.05.12
✎
17:34
|
(124) только с более общей формулировкой
|
|||
127
Mikeware
11.05.12
✎
17:35
|
программист - человек, с пеной у рта доказывающий неизвестно что неизвестно кому неизвестно зачем...
|
|||
128
andrewks
11.05.12
✎
17:35
|
(125) 3 5 8 11 19 30
выкинули 30. в чём затык? |
|||
129
BiBijke
11.05.12
✎
17:36
|
(121) Это вы так думаете )
(115) Фраза кривая для вас или вы же взяли определение из справочника?) Массив — упорядоченный набор данных, для хранения данных одного типа. Посути состоит из отдельных однотипных элементов. Поэтому фраза "массив из чисел" вполне корректна (хотя я ее даже не употреблял нигде, но раз придраться больше уже не к чему, жду когда придеретесь к запятым). |
|||
130
Mikeware
11.05.12
✎
17:39
|
(129) ее ненавижо употребило...
|
|||
131
Mikeware
11.05.12
✎
17:41
|
(129) режет слух. числовой массив,строковый массив - нормально. массив, заполненый... тоже... а вот "состоящий из..." - когда работал с массивами "на низком уровне" - фраза "не катит"
|
|||
132
Ненавижу 1С
гуру
12.05.12
✎
06:34
|
(129) да, я так думаю
|
|||
133
Ненавижу 1С
гуру
12.05.12
✎
08:30
|
Для невменяемых специально в (10) первую строчку читать так:
ПолнаяСумма = Х*(Массив.Количество()+1)/2; |
|||
134
experimentator76
12.05.12
✎
08:56
|
(0) на SQL поди есть задачки ??
|
|||
135
Kashim
12.05.12
✎
09:34
|
Может загрузить в СписокЗначений, отсортировать, найти мин. и макс. значения и найти недостающие значения?
|
|||
136
Kashim
12.05.12
✎
09:44
|
СпЗнач = Новый СписокЗначений;
СпЗнач.ЗагрузитьЗначения(Массив); СпЗнач.СортироватьПоЗначению(); Для i=СпЗнач[0] по СпЗнач[СпЗнач.Количество()-1] Цикл Если СпЗнач.НайтиПоЗначению(i)=Неопределено Тогда Сообщить("Отсутствует: "+i); КонецЕсли; КонецЦикла; |
|||
137
НафНаф
12.05.12
✎
11:24
|
(101) воспользуемся формулой a[0]+a[1]+...+a[n]=a[n+2]-a[1]=a[n]+a[n-1]-a[1]
в цикле за один проход находим величины: 1. сумму массива 2. a[1] 3. а[n] 4. a[n-1] далее находим a[0]+a[1]+...+a[n] = a[n]+a[n-1]-a[1] ну и дальше из полученного вычитаем сумму массива |
|||
138
Dmitry77
12.05.12
✎
11:40
|
можно тупо в лоб решать
и = истина; сч1 = 1; сч2 = 1; пока и цикл если сч1 < n тогда ... здесь сортировка сч1 = сч1 + 1; конецесли; если сч2 < n тогда ... здесь вычисляем в уже отсортированном массиве нужный элемент и сравниваем с элементом массива, выводим его. сч2 = сч2+1; иначе и = ложь; конецесли; конеццикла; |
|||
139
Reset
12.05.12
✎
11:42
|
(138) "И" нельзя в качестве идетификатора использовать, влобрешатель :)
|
|||
140
Reset
12.05.12
✎
11:42
|
Идентификатора*
|
|||
141
Dmitry77
12.05.12
✎
11:43
|
(139) угу надо его заменить на инд например
|
|||
142
experimentator76
12.05.12
✎
19:27
|
интересно как ТС делает вброс и пропадает )
может он тестит мисту ? |
|||
143
andrewks
12.05.12
✎
21:18
|
(137) незачёт. а если выкинули a[n] или a[n-1]?
|
|||
144
НафНаф
12.05.12
✎
22:53
|
(142) может его забанили, такой вариант не рассматриваешь?
(143) надо еще думать )) |
|||
145
andrewks
13.05.12
✎
17:34
|
(144) сдаёшься?
|
|||
146
НафНаф
13.05.12
✎
18:44
|
(145) думаю еще ))
|
|||
147
andrewks
13.05.12
✎
21:27
|
(146) даю подсказку: возможны три ситуации:
1. удалили последний элемент массива 2. удалили один из двух предпоследних элементов массива 3. удалили другой элемент массива, кроме первых двух и последних трёх |
|||
148
НафНаф
13.05.12
✎
22:56
|
(147) всё это понятно, напишу через 2-3 дня
|
|||
149
andrewks
14.05.12
✎
09:27
|
ну чё, кто-нибудь ещё хочет попытаться решить (101)?
|
|||
150
Mikeware
14.05.12
✎
09:29
|
(149)"сколько?"© :-))
|
|||
151
andrewks
14.05.12
✎
09:32
|
(150) + 5 баллов к ЧСВ, +10 баллов к карме, возможно, даже немного вырастет мужской орган :)))
|
|||
152
НафНаф
14.05.12
✎
10:03
|
(101)
a[0]+a[1]+...+a[n]=a[n+2]-a[1] = a[n]+a[n+1]-a[1] = 2*a[n]+a[n-1]-a[1] a[0]<a[1]<...<a[n]<... - строгие неравенства, случай нулевой последовательности неинтересен как и ранее в цикле за один проход находим величины: 1. сумму массива S 2. a[1] 3. M - максимальный элемент массива 4. N - максимальный, среди всех меньших M (предпоследний) Если бы не удалили элемент, то было бы тождество S = 2*M+N-a[1] Вычислим разность: 2*M+N-a[1]-S >= 0 1. Если она равна 0, то удалили именно a[n], то есть M=a[n-1], N=a[n-2] => восстанавливаем удаленный как a[n]=M+N 2. Если она больше 0, то сравним ее с N 2.1. Если она равна N, то удалили именно a[n-1], восстановим его как a[n-1]=M-N 2.2. Если не равна N (на самом деле даже строго меньше), то это и есть тот самый удаленный элемент |
|||
153
andrewks
14.05.12
✎
10:13
|
(152) сразу навскидку возникает несколько вопросов:
1. по мелочи - последний элемент a[n-1], а не a[n], ибо нумерация индекса идёт с нуля 2. понятно, что n>=3. а что будет при n=3? а при n=4? 3. каков критерий/алгоритм определения a[1]? ведь в условии нет того, что обязательно a[0]<a[1], если будешь искать минимум, то он может быть как a[0], так и a[1] |
|||
154
andrewks
14.05.12
✎
10:20
|
(152) и ещё: странно, но в моём алгоритме мне понадобилось вычислять больше величин при проходе массива в цикле. надо будет потестить, либо твой алгоритм не учитывает некоторые случаи, либо я излишне загромоздил свой алгоритм :)
|
|||
155
john_ddd
14.05.12
✎
11:09
|
Массив = Новый Массив;
Массив.Добавить(1); Массив.Добавить(10); Массив.Добавить(5); Массив.Добавить(7); Ищем = Истина; Н = 0; МаксЧисло = 0; Пока Ищем Цикл Если Массив.Найти(Н) = Неопределено Тогда Сообщить("Отсутствует: "+Н); КонецЕсли; Если Н <= Массив.Количество()-1 Тогда МаксЧисло = Макс(МаксЧисло,Массив[Н]); ИначеЕсли Н = МаксЧисло Тогда Ищем = Ложь; КонецЕсли; Н = Н + 1; КонецЦикла; |
|||
156
fisher
14.05.12
✎
11:50
|
Как-то так:
ВсегоЭталон = 0; Всего = 0; Для х = 0 по n-1 Цикл ВсегоЭталон = ВсегоЭталон + x; Всего = Всего + Массив[x]; КонецЦикла; Сообщить(ВсегоЭталон + n - Всего); |
|||
157
fisher
14.05.12
✎
11:52
|
Чорд, уже было...
|
|||
158
vmv
14.05.12
✎
11:55
|
(0) проще говоря, это задача поиска "дырок" в ряде натуральных чисел - решается одним запросом, правда тескт запроса нужно генерить.
Готового запроса(без генерации) пока не изобрели, даже Чистов пытался. на 8.1-8.2 пока не реализуемо циклические алгоритмы как не оптимизируй - это г-код. гугли, ждем 8.3, мож получиться создать запрос поиска "дырок" без генерации текста запроса, а просто одним универсальным текстом. ета все, извращайтесь |
|||
159
fisher
14.05.12
✎
11:55
|
Ыыыы... А в (10) еще круче. А я навскидку формулу для этого ряда не нашел...
|
|||
160
НафНаф
14.05.12
✎
11:59
|
(153) нда... не всё так сладко в (101)(( Ответ на пункт 2 и 3. Найдем таки a[1]:
опять же всюду считаем max{a[0],a[1]}>0 Случай, когда в начальном (до удаления) массиве было всего 3 элемента рассмотрим отдельно - на самом деле он элементарен, то есть если цикл прошел всего 2 итерации - то "голубчик попался": a[0]+a[1] Когда в начальном 4 элемента (3 итерации цикла) - также отдельно, P - некий третий, P>=max(a[0],a[1]) Если P>a[0]+a[1], то недостающий это a[0]+a[1]. Если же P=a[0]+a[1], то задача не имеет однозначного решения, так как недостающий это либо 2*a[0]+a[1], либо a[0]+2*a[1] (однозначно если a[0]=a[1]). Остальные случаи - ищем a[1] для этого выберем два наименьших элемента, из множества без a[0],a[1]. Пусть это P<=Q. Это два элемента из множества {a[2],a[3],a[4]}. 0.Так как a[4]>a[3], то P=Q <=> P=Q=a[2]=a[3] <=> a[1]=0. 1.Теперь P<Q: 1.1.Если a[0]+a[1]=P, то P=a[2] 1.1.1.Если Q-P один из {a[0],a[1]}, то Q-P=a[1] 1.1.2.Иначе - Q-P=a[3] => Q-2*P=a[1] 1.2.Если a[0]+a[1]<P, то P=a[3], Q=a[4] => Q-P=a[2] => 2*P-Q=a[1] вот как то так, это дописка к (152) По пункту 1. - да я увеличил количество на 1, но на рассуждения это не влияет |
|||
161
andrewks
14.05.12
✎
18:20
|
(160)
да, всё правильно, для n=3 всё тривиально до безобразия, этот случай рассматривать не будем для n=4 однозначного решения в общем случае не существует: примеры: нач.посл-ти: 1 2 3 5 и 2 1 3 4 если удалили последний элемент, однозначно его вычислить невозможно. можно выделить подзадачу с имеющимся решением, наложив доп.условия, например, что a[0]<=a[1], но, собственно, этот случай нам тоже неинтересен, ибо самое вкусное начинается при n>=5 "вырожденный случай", когда a[0]=a[1]=0, в принципе, тоже можно заложить в решение, ведь ничего сложного в его детектировании нет, а решение существует и абсолютно однозначно: удалённый элемент = 0 :) итак, теперь переходим к самому вкусному, к n>=5 как я уже говорил, возможны три варианта: 1. удалили последний элемент массива 2. удалили один из двух предпоследних элементов массива 3. удалили другой элемент массива, кроме первых двух и последних трёх казалось бы, чего сложного? для каждого варианта можно без проблем написать формулу для вычисления недостающего элемента. пусть max(0) - максимальный элемент из данной нам "секвестированной" посл-ти, max(-1) - предшествующий ему максимум (т.е. "предыдущий"), sum(0) - сумма элементов первоначальной посл-ти, sum(-1) - сумма элементов "секвестированной" посл-ти 1. Удалённый элемент = max(0)+max(-1) 2. Удалённый элемент = max(0)-max(-1) 3. sum(0)=2*max(0)+max(-1)-a[1], тогда Удалённый элемент = sum(0)-sum(-1) казалось бы, вроде всё просто? нет, хренушки. возникает вопрос: а как же достоверно определить a[1], учитывая, что в условиях задачи нет "подарка" в виде условия a[0]<=a[1]? ещё один возникающий вопрос: а как достоверно определить, что из посл-ти выкинули последний элемент - a[n-1]? когда я накидал 11-го числа условия задачи в (101), у меня только ещё было изложенный выше концептуальный зародыш решения, и эти вопросы у меня ещё не возникли. 12-го утром на свежую голову я понял, как можно определить, что из посл-ти выкинули последний элемент - a[n-1], но формула, опять-таки, опиралась на пресловутый a[1]. потом целый день было не до этого - рабочий день, всё-таки, вечерком попытался опять наскоком решить задачу нахождения a[1] - ничего не вышло. уже был готов пойти на попятную, и признать, что без условия a[0]<=a[1] задача не имеет однозначного решения, но решил, что утро вечера мудренее. и оказался прав, ибо свежий утренний мозг 13-го мая вывел меня на алгоритм достоверного определения a[1]. хочу заметить, что изложенный тобой алгоритм определения a[1], некорректен, ибо никто не давал клятву не выкидывать из посл-ти a[2], a[3] или a[4], а доступ у нас только к "секвестированной" посл-ти, да и то в рамках только одного цикла |
|||
162
НафНаф
14.05.12
✎
19:30
|
(161) эээ.. взял все и перечеркнул, ты прочти внимательней, там все учтено (ну мне кажется так, по крайней мере)
|
|||
163
НафНаф
14.05.12
✎
19:34
|
(161) тем более, что там все учтено, находим P, Q и a[0], a[1] (причем не зная, кто есть кто)и по их отношениям находим a[1]
|
|||
164
andrewks
14.05.12
✎
23:38
|
(163) ах, ч0рт, каюсь, невнимательно прочитал. гениально!
а я решил так: ряд Фибоначчи, как и ряд из (101), являются частными случаями линейной рекуррентной последовательности, а для неё имеется набор уже доказанных св-в и формул, например, для нашего случая, справедливо равенство: a[i]=a[1]*F[i-1]+a[0]*F[i-2], где F - классический ряд Фибоначчи 1, 1, 2, 3, 5, 8, 13 и т.д. в процессе обхода циклом посл-ти находим min(0) - минимум, и min(1) - "следующий" минимум. это наши искомые a[0] и a[1], осталось только разобраться, кто из них кто. также в процессе обхода циклом "по пути" вычисляем F[n-1] и F[n-2], далее, проверяем соотношение min(0)*F[n-1]+min(1)*F[n-2]=max(0), если оно выполнено, это означает, что min(0) и min(1) перепутаны местами, делаем им ротацию, и окончательно получаем min(0)=a[0], min(1)=a[1] |
|||
165
andrewks
14.05.12
✎
23:40
|
+(164) кстати, интересная получилась задачка, сам не ожидал
|
|||
166
andrewks
14.05.12
✎
23:48
|
+(164) и ещё, забыл:
можно явно выразить любой a[i], ибо F[i-1] и F[i-2] явно выражаются формулой. так, для любого i F[i]=1/(1-2q)*((1-q)^i-q^i), где q - любой корень характеристического уравнения q^2-q-1=0 т.о. q=(1+-sqrt(5))/2. т.о., если использовать мат.вычисления, можно прямо найти любой член первоначальной посл-ти |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |