Belebonyolódtam egy feladatba, tud valaki segíteni?
Adott egy X érték (pozitív egész szám), amit szét kell darabolnom egy tömbbe úgy, hogy a tömb első eleme szigorúan Y, az utolsó eleme legfeljebb Y legyen, a közbelsők (ha vannak), akkor 2Y maximum. Mi a legjobb elosztás, hogy a lehető legjobban megközelítsük a 2Y-t a köztes elemeken?
Pl. ha X = 50, Y = 5, akkor az elosztás: 5, 10, 10, 10, 10, 5, a képlet, amivel próbálkoztam, csak ideális esetben jó: ((X-2Y) / 2Y) + 2
Az egyszerűség kedvéért maradjunk az Y = 5 értéknél, bármilyen X-re működnie kell.
UPDATE, MEGOLDÁS:
Írtam egy függvényt, ami tetszőleges közbenső értékekkel is működik (2Y helyett bármi lehet).
Az $x = összes elem, $y = első és utolsó maximális elem (az első egyenlő $y-nal), $insider = közbenső maximális elemek száma.
Felhasználható olyan listák előállítására, ahol az első és az utolsó oldalon fejléc található (több helyet foglal), a közbenső oldalakon meg nem (több tétel fér el), pl. többoldalas számlák előállítása esetén.
function partition($x, $y, $insider)
{
$after_first_item = $x - $y;
$singularity = $after_first_item;
$next = 0;
$next_try = $insider;
$items = array($x);
if ($singularity > 0)
{
do
{
if ($singularity <= $y && $singularity > 0)
{
$items[] = $singularity;
break;
}
if ($singularity < 0)
{
$next++;
$next_try = $insider - $next;
$singularity = $after_first_item;
$items = array($x);
}
$items[] = $singularity;
$singularity = ($singularity - $next_try) ;
} while (1);
}
$count_items = count($items);
return array($next_try, $count_items);
}
Hozzászólások
Egyszerűnek néz ki: Y 2Y 2Y ... az utolsó pedig M <= Y , egyébként M-1 1
valami ilyesmi?
Igen, így néz ki.
--
Coding for fun. ;)
Javítva:
Ha képletet akarsz:
(X-Y)/2Y
Az eredmény egész része a köztes elemek száma, a maradék az utolsó elem értéke.
Ha a maradék nagyobb Y-nál*, akkor van még egy köztes elem, melynek érték Y, és az utolsó elem a maradék-Y.
-----
2Y-nal oszd, mert az első és utolsó elem együttesen (max) 2Y, a közbensők is 2Y; és felfele kell kerekíteni.
elemek száma N = Math.ceil(X/(2*Y)+1)
Ez akkor nem működik amikor maradék kisebb mint Y.
Igaz, ha X<3Y+1, akkor nem teljesül. Inkább a 2Y-t teljesíti, mint az utolsó max Y feltételt.