Nasıl y insanlar arasında x kek dağıtabilirsiniz?

2 Cevap

Ben x kek kimlikleri ve y insanların kimlikleri ile başka bir ilişkisel dizi ile bir dizi var. Her kek tam 2 kişi tarafından ve her kişi genel pasta adil bir pay alır zevk emin olmak istiyorum. Ancak, kekler (kişi başına ortalama pasta bir kısmını ise, yani bu fraksiyon bazıları için yuvarlanır, ve aşağı diğerleri için) tüm tutulmalıdır. Hiç kimse iki defa aynı kek atanabilir. Örneğin:

$cake = array(''1','2')
$people = array('1','2','3')

Bunu yapmak için, ben her satır bir pasta-kişi atama temsil eden yeni bir dizi oluşturmak istiyoruz. Her kek iki kişiye tahsis edilirken, bu tablodaki satır sayısını kek tam iki sayı olmalıdır. Orada bu sorunun tam 1 çözüm olmayacak ama yukarıdaki örnekte bir çözüm olacaktır:

$cake_person = array(
    '1'=>array('1', '1'),
    '2'=>array('1', '2'),
    '3'=>array('2', '2'),
    '4'=>array('2', '3'),
    )

Insanlar 1 ve 3 dışarı kaybediyor ama etrafında gitmek için daha fazla pasta olduğundan olduğunu fark! Her kek tam iki kez verilmelidir.

Nasıl insanlar ve kek büyük sayılar için güvenilir böyle bir çözüm üretebilir?


Artefacto en yararlı tepkisini hayata sahip, ben herkesten çok faydalı bulduğu sadece durumda aşağıda benim kod göndermeye karar verdim.

Data

//Create people array with 25 people
$people = range(1,25);

//Create cake array with 77 cakes
$cake = range(1,77);

Code

$people_cakes = array();
$totalPeople = count($people);
$idp = 0;

foreach($cakes as $cake) {
    $id1 = $idp % $totalPeople;
    $id2 = ($idp + 1) % $totalPeople;
    $people_cakes[] = array($people[$id + 1], $cake);
    $people_cakes[] = array($people[$id + 2], $cake);

    $idp = $idp + 2;
    }

2 Cevap

Kek yoluyla dolaşır ve sırayla parçaları atar bir algoritma:

  • IDP = 0 ile başlayın
  • Iterate through the cakes
    • Pozisyon kişilerin dizinin (IDP mod toplam kişi) saklanan kişiye ilk hald ver.
    • Pozisyon kişilerin dizinin ((IDP +1) mod toplam kişi) saklanan kişiye ikinci yarısını ver.
    • IDP'nize toplamı 2

Bu (kişi 1 iki yarısını alacak) sizin örnekte olduğu gibi aynı sonucu vermeyecektir, ama bu bir gereklilik değildi.

Örnek komut:

$cakes = range(1, 77);
$people = range(1,25);

$result = array();
$idp = 0;
foreach ($cakes as $cid) {
    $result[] = array(
        'cake_id' => $cid,
        'person_id' => $people[$idp % count($people)],
    );
    $result[] = array(
        'cake_id' => $cid,
        'person_id' => $people[($idp+1) % count($people)]
    );
    $idp += 2;
}


$total = array();
foreach ($result as $a) {
    if (!array_key_exists($a['person_id'], $total)) {
        $total[$a['person_id']] = 0;
    }
    $total[$a['person_id']]++;
}

var_dump($total); //gives the number of halves per person

Ben henüz denemedim ama ben çalışmak gerektiğini düşünüyorum

Adlı 77 kek ve 25 kişilik örnek verelim.

Her kek 2 kişi tarafından yenir ise, 12.5 kek gerek 25 kişiyi beslemek için. Biz cömert ve yapacağız bunu 13 (yani kullanımı ceiling)

So, you have 77 cakes, that means you can give 77 / 13 = 5.92 cakes to each person. We round that down and get 5. In order to generalise I will call this minCakes

Yani bu noktada herkesin at least minCakes kek almak gerektiğini biliyorum. Eğer dağıtabilir ki biraz daha olacaktır.

Yani şimdi bir anda kişi 2 üzerinde yineleme ve

minCakes 1'den kişinin 1 ve 2 kişinin kek vermek

minCakes * 2 + 1 için minCakes + 1 adlı kişiyi 3 ve 4 kek vermek

....

(, Bu yüzden onun minCakes pasta almak ve minCakes için insanlara 1 sayısını yarısını verecektir: Bizim durumumuzda kişi 25 yalnızdır.

Esasen kişiler n ve n 1 kek minCakes * floor(n/2) + 1 minCakes * floor(n/2) + minCakes gerekecektir

Insanların sayısı tek ise diğer minCakes insanlara kek diğer yarısını dağıtmak zorunda gibi, ayrı ayrı son bir işlem.

Şimdi geriye ne dağıtmak için zaman. Bizim durumumuzda 5 * 24/2 = 60 artı kişi için 25 5 kekler bize kullanılan 65 kek büyük bir toplam verir, bu yüzden 77 - 65 = 12 kek bıraktı.

Sen (ilk olanlar zaten onların ekstra bir pay vardı gibi) sayısına minCakes+1 bizim gibi durumda da 1 numara (insanların sayısı oldu bile) ya da gelen kişiler, dağıtmak başlar.

Şimdi sadece bir anda insanlar üzerinde tekrar 2 yineleme ve onlara yarım pasta atayın. Geri 1 25 sadece döngü numara almak.