Son zamanlarda Puzzling.SE'de, daha fazla sayıda hangi iki şişenin zehirin sadece her iki bileşen sarhoşsa aktive edildiğinde zehirlendiğini belirleme konusunda yazdığım bir sorun vardı. Oldukça çileye dönüştü, çoğu insan onu tamamen farklı algoritmalar kullanarak 18 veya 19 mahkuma indirmeyi başardı.
Orijinal sorun bildirimi aşağıdaki gibidir:
Partileri atmayı seven bir ortaçağ krallığının hükümdarısınız. Şarap şişelerinizden birini son kez zehirlemeye çalışan kurye, 1000'den hangi şişeyi zehirlediğini sadece on mahkumla tanımayı başardığınızı öğrenmek için öfkeliydi.
Bu sefer biraz daha zeki. Kompozit bir zehir geliştirdi
P
: iki ayrı ayrı zararsız bileşen karıştığında ölümcül olan ikili bir sıvı; bu epoksinin nasıl çalıştığına benzer. Sana bir şişe daha 1000 şarap şişesi gönderdi. Bir şişenin bileşeniC_a
, diğerinin bileşeni vardırC_b
. (P = C_a + C_b
)Her iki bileşeni de içen herkes, gece ne zaman sıvıyı emdiklerine bakılmaksızın, son bileşeni içtikleri gece yarısında iner. Her zehir bileşeni, ikinci bileşen etkinleşene kadar vücutta kalır, bu nedenle bir bileşeni bir gün ve başka bir bileşeni ertesi gün içerseniz, ikinci günün sonunda gece yarısı ölürsünüz.
Bir sonraki partinizden iki gün önce. Hangi iki şişenin lekelendiğini belirlemek için test için kullanmanız gereken asgari mahkum sayısı nedir ve bu sayıda mahkumla hangi algoritmayı takip etmeniz gerekir?
Bonus
Ayrıca, emrinizde sabit bir 20 mahkum sınırınız olduğunu varsayalım, teorik olarak test edebileceğiniz ve hangi şişelerin etkilendiği konusunda kesin bir sonuca varabileceğiniz maksimum şişe sayısı nedir?
Göreviniz bonus problemini çözmek için bir program oluşturmaktır. Verilen n
mahkumlar, programı arasında iki zehirlenen şişeleri tespit etmek mümkün olacak bir test takvimi hazırlar m
şişe, nerede m
mümkün olduğunca büyük.
Programınız başlangıçta N
mahkum sayısını , sayısını girecektir. Sonra çıktı:
M
, test etmeye çalışacağınız şişe sayısı. Bu şişeler gelen etiketlenir1
içinM
.N
her mahkumun içeceği şişelerin etiketlerini içeren çizgiler.
Programınız daha sonra ilk gün hangi mahkumların öldüğünü, ilk satırdaki mahkumun 1
ve bir sonraki satırın2
vb. alınacaktır.
N
her mahkumun içeceği şişelerin etiketlerini içeren daha fazla satır. Ölü mahkersmların boş çizgileri olacak.
Programınız daha sonra ikinci günde mahkumların öldüğü bir girdi olarak alınacak ve iki sayı verilecektir, A
ve B
program düşünür iki şişe zehir içeren temsil.
İki mahkum ve dört şişe için örnek bir girdi, şişeler 1
ve 3
zehirliyse şu şekilde olabilir:
> 2 // INPUT: 2 prisoners
4 // OUTPUT: 4 bottles
1 2 3 // OUTPUT: prisoner 1 will drink 1, 2, 3
1 4 // OUTPUT: prisoner 2 will drink 1, 4
> 1 // INPUT: only the first prisoner died
// OUTPUT: prisoner 1 is dead, he can't drink any more bottles
3 // OUTPUT: prisoner 2 drinks bottle 3
> 2 // INPUT: prisoner 2 died
1 3 // OUTPUT: therefore, the poisoned bottles are 1 and 3.
The above algorithm may not actually work in all
cases; it's just an example of input and output.
Programınızın test programı, geçerli bir gönderim olması için her bir zehirli şişenin çiftini başarıyla belirlemelidir.
Programınız sırasıyla aşağıdaki ölçütlere göre puanlanacaktır:
Vaka için fark edebileceği maksimum şişe sayısı
N = 20
.Dava için şişe sayısı
N = 21
ve bundan sonra daha yüksek vakalar.Kodun uzunluğu. (Daha kısa kod kazanır.)