|
У меня еще одна простая задачка для любителей алгоритмов | ☑ | ||
---|---|---|---|---|
0
Простенький вопросик
11.05.12
✎
16:13
|
Есть неупорядоченный массив из различных чисел от 0 до х, необходимо за один цикл найти недостающее число.
Кто может на 8ке быстро код написать? |
|||
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. т.о., если использовать мат.вычисления, можно прямо найти любой член первоначальной посл-ти |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |