Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาขนาดรถบัสที่บรรทุกกลุ่มเพื่อนได้ทุกกลุ่ม (Python)

โจทย์

มีกลุ่มนักเรียน n กลุ่ม ขนาด m คนต่อกลุ่ม กลุ่มต้องขึ้นรถร่วมกัน ไม่แยก และต้องขึ้นตามลำดับ หาขนาดรถบัสที่ทำให้ทุกเที่ยวไม่มีที่ว่าง

ตัวอย่าง: gr_no = [3,4,2,2,1,4,3,5] → Output: [12, 24] (รถ 12: เที่ยว1 กลุ่ม1-5, เที่ยว2 กลุ่ม6-8; รถ 24: เที่ยวเดียว)

อัลกอริธึม

  1. คำนวณ Prefix Sum ของขนาดกลุ่ม
  2. หาตัวประกอบ (Factors) ของผลรวมทั้งหมด
  3. ตรวจสอบแต่ละ Factor ว่า Prefix Sum ทุกตัวหาร Factor ลงตัวหรือไม่

โค้ด Python


from functools import reduce

def solve(gr_no):
    total = [gr_no[0]]
    for i in range(1, len(gr_no)):
        total.append(total[i - 1] + gr_no[i])
    
    b_sizes = []
    for size in factor_ret(sum(gr_no)):
        temp_list = list(filter(lambda x: x % size == 0, total))
        index = 1
        indicator = True
        for point in temp_list:
            if point != size * index:
                indicator = False
                break
            index += 1
        if indicator:
            b_sizes.append(size)
    return b_sizes

def factor_ret(n):
    return sorted(set(reduce(list.__add__, ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0))))

print(solve([3, 4, 2, 2, 1, 4, 3, 5]))  # Output: [12, 24]

Input / Output

Input:  [3, 4, 2, 2, 1, 4, 3, 5]
Output: [12, 24]