|
Тема |
Re: Алгоритъм [re: Sargon lll] |
|
Автор | algo boy (Нерегистриран) | |
Публикувано | 25.08.08 14:54 |
|
|
Значи така да разбирам:
имаш (примерно за 30 елемента) множество (сортирано) {a1, a2, ... a30} = K ∈ N
Решение:
правиме множество {b1, b2, ... b450} = L ∈ N, където b1 = a1*a2, b2 = a1*a3, ... , b450 = a29*a30
сортираме L и проверяваме дали има повтарящи се елементи. Ако има, то махаме всички освен този (примерно b_i, където b_i = (a_i * a_j)) при който max(a_i, a_j) е най-малък.
След това правиме класове 1/b1, 1/b2, .. 1/b_max. За всеки клас намираме най-малък и най-голям елемент, който са съответно (за класа b_i) b1/b_i и b_max/b_i
При дадено A минаваме през всички класове 1/b1 до 1/b_max и проверяваме дали за текущия клас 1/b_i : b1/b_i <= A <= b_max/b_i
Ако да, то намираме дали съществува в множеството елемента b_x, така че b_x/b_i = A. Първо проверка дали A*b_i е цяло число и след това търсиме дали го има в стойностите с бинарно търсене или хеш-таблица примерно, както си прецениш си го имплементирай.
За всеки клас 1/b_i има най-много едно решение. И така въртиш през всички класове и пазиш само b_x/b_i с най-нискaтa стойност на max(a_j, a_k, a_l, a_m) (като приемаме, че b_x = a_j*a_k, b_i = a_l*a_m).
Ами това е, мисля! Надявам се, че ме разбра :)
|
| |
|
|
|