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);
}
- 5020 megtekintés
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?
5: 5
6: 5 1
7: 5 2
8: 5 3
9: 5 4
10: 5 5
11: 5 5 1
12: 5 6 1
13: 5 7 1
14: 5 8 1
15: 5 9 1
16: 5 10 1
17: 5 10 2
18: 5 10 3
19: 5 10 4
20: 5 10 5
21: 5 10 5 1
22: 5 10 6 1
23: 5 10 7 1
24: 5 10 8 1
25: 5 10 9 1
26: 5 10 10 1
- A hozzászóláshoz be kell jelentkezni
Igen, így néz ki.
--
Coding for fun. ;)
- A hozzászóláshoz be kell jelentkezni
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.
-----
(&%;_98\<|{3W10Tut,P0/on&Jkj"Fg}|B/!~}|{z(8qv55sr1C/n--k**;gfe$$5a!BB]\.-
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
Ez akkor nem működik amikor maradék kisebb mint Y.
- A hozzászóláshoz be kell jelentkezni
Igaz, ha X<3Y+1, akkor nem teljesül. Inkább a 2Y-t teljesíti, mint az utolsó max Y feltételt.
- A hozzászóláshoz be kell jelentkezni