Имя: Пароль:
1C
 
У меня еще одна простая задачка для любителей алгоритмов
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

НашеЧисло=Х;
   Для i=0 по Х-1 Цикл
       НашеЧисло=НашеЧисло+i-Мас[i];
   КонецЦикла;
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.
т.о., если использовать мат.вычисления, можно прямо найти любой член первоначальной посл-ти
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший