Alice, öğrenci, gelecek haftalarda çok ödev yapıyor. Ödevlerin her biri tam olarak bir gün sürer. Her öğenin ayrıca bir son tarih ve notları üzerinde olumsuz bir etkisi vardır (gerçek sayıyı varsayar, sadece karşılaştırılabilirliği varsaymak için bonus puanlar), son tarihi kaçırırsa.
(Son teslim tarihi, not etkisi) listesi veren bir fonksiyon yazın, hangi ödevin hangi günde notları üzerindeki kötü etki toplamını en aza indirecek bir program hazırlar.
Tüm ödevlerin sonunda yapılması gerekir, ancak bir öğe için son tarihi kaçırırsa, ne kadar geç teslim ettiği önemli değildir.
Alternatif bir formülasyonda:
ACME corp müşterilere su sağlamak istiyor. Hepsi bir yokuş yukarı sokakta yaşıyor. ACME'nin cadde boyunca dağılmış birkaç kuyusu vardır. Her kuyu bir müşteri için yeterli su taşır. Müşteriler tedarik edilecek farklı miktarlarda para teklif ederler. Su sadece yokuş aşağı akıyor. Hangi müşterilere tedarik sağlanacağını seçerek geliri en üst düzeye çıkarın.
Son tarihleri kova sıralamasını kullanarak sıralayabiliriz (veya son tarihe göre sıraladığımızı varsayabiliriz).
İlk önce not etkisini azaltarak sıralarsak, açgözlü bir algoritma ile sorunu kolayca çözebiliriz. Bu çözüm O (n log n) 'den daha iyi olmayacaktır.
Medyan Medyan'dan ve randomize doğrusal minimum yayılan ağaç algoritmalarından esinlenerek , basit zamanlama / akış problemimi (randomize?) Lineer zamanda da çözebileceğimizden şüpheleniyorum.
Bakıyorum:
- a (potansiyel olarak rastgele) doğrusal zaman algoritması
- veya alternatif olarak, doğrusal zamanın mümkün olmadığı iddiası
Basamak taşı olarak:
- Son tarihlerden önce hangi öğelerin yapılabileceğini bilmenin, tüm programı doğrusal zamanda yeniden oluşturmak için yeterli olduğunu zaten kanıtladım. (Bu anlayış, yalnızca sertifika hakkında sorduğum ikinci formülasyonun altında.)
- Basit (integral!) Doğrusal bir program bu sorunu modelleyebilir.
- Bu programın ikiliğini kullanarak, eğer ikili programa çözüm verilirse, adayın önerdiği çözüm doğrusallık açısından doğrusal zamanda kontrol edilebilir. (Her iki çözüm de doğrusal sayıda bit ile temsil edilebilir.)
İdeal olarak, bu sorunu sadece sınıf etkileri arasındaki karşılaştırmayı kullanan ve orada sayı kabul etmeyen bir modelde çözmek istiyorum.
Bu soruna iki yaklaşımım var - biri son teslim tarihini ve etkiyi kullanan muamelelere, diğer QuickSelect benzeri rastgele pivot öğelerini seçmeye ve öğeleri çarpmalara göre bölümlemeye dayalı. Her ikisinin de O (n log n) veya daha kötü performansı zorlayan en kötü durumları var, ancak her ikisinin performansını bozan basit bir özel durum oluşturamadım.