ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 26 รุ่นระหว่างกลางโดยผู้ใช้ 3 คน)
แถว 1: แถว 1:
 
== ข้อ 1 ==
 
== ข้อ 1 ==
กำหนดเซตของจำนวนเต็ม <math>A = \{ a_1, a_2, \ldots, a_n \}\,</math> ที่มีจำนวนสมาชิกเท่ากับ <math>n \,</math> ตัว และกำหนดจำนวนเต็ม <math>S \,</math> มาให้ เราต้องการตอบคำถามที่ว่่า "มีซับเซต <math>B \,</math> บางซับเซตของ <math>A \,</math> ที่ผลบวกของสมาชิกของมันเท่ากับ <math>S \,</math> หรือไม่?" (กล่าวคือ เราต้องการหาเซต <math>B = \{ b_1, b_2, \ldots, b_k \} \subseteq A \,</math> ที่ <math>b_1 + b_2 + \cdots + b_k = S \,</math>)
+
[Subset Sum Problem] กำหนดเซตของจำนวนเต็ม <math>A = \{ a_1, a_2, \ldots, a_n \}\,</math> ที่มีจำนวนสมาชิกเท่ากับ <math>n \,</math> ตัว และกำหนดจำนวนเต็ม <math>S \,</math> มาให้ เราต้องการตอบคำถามที่ว่่า "มีซับเซต <math>B \,</math> บางซับเซตของ <math>A \,</math> ที่ผลบวกของสมาชิกของมันเท่ากับ <math>S \,</math> หรือไม่?" (กล่าวคือ เราต้องการหาเซต <math>B = \{ b_1, b_2, \ldots, b_k \} \subseteq A \,</math> ที่ <math>b_1 + b_2 + \cdots + b_k = S \,</math>)
  
 
ยกตัวอย่างเช่น ถ้า <math>A = \{1, 2, 3, \ldots, 10 \}</math> และ <math>S = 20 \,</math> แล้ว คำตอบของคำถามข้างบนคือ "ใ่ช่" เนื่องจากมีซับเซต <math>\{ 2, 8, 10 \} \,</math> ที่ผลบวกของมันมีค่าเท่ากับ 20 (ความจริงแล้วยังมีซับเซตอื่นๆ อีกมากมายที่มีผลบวกเท่ากับ 20) ในทางกลับกัน ถ้า <math>S = 100 \,</math> แล้วเราไม่สามารถหาซับเซตของ <math>A \,</math> ที่มีผลบวกเท่ากับ <math>100 \,</math> ได้เลย (ทำไม?)
 
ยกตัวอย่างเช่น ถ้า <math>A = \{1, 2, 3, \ldots, 10 \}</math> และ <math>S = 20 \,</math> แล้ว คำตอบของคำถามข้างบนคือ "ใ่ช่" เนื่องจากมีซับเซต <math>\{ 2, 8, 10 \} \,</math> ที่ผลบวกของมันมีค่าเท่ากับ 20 (ความจริงแล้วยังมีซับเซตอื่นๆ อีกมากมายที่มีผลบวกเท่ากับ 20) ในทางกลับกัน ถ้า <math>S = 100 \,</math> แล้วเราไม่สามารถหาซับเซตของ <math>A \,</math> ที่มีผลบวกเท่ากับ <math>100 \,</math> ได้เลย (ทำไม?)
  
 
จงออกแบบอัลกอริทึมเพื่อแก้ปัญหาข้างต้น อัลกอริทึมของคุณควรใช้เวลาทำงานไม่เกิน <math>O(n 2^n) \,</math>
 
จงออกแบบอัลกอริทึมเพื่อแก้ปัญหาข้างต้น อัลกอริทึมของคุณควรใช้เวลาทำงานไม่เกิน <math>O(n 2^n) \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 1|เฉลย]]
  
 
== ข้อ 2 ==
 
== ข้อ 2 ==
[จิตรทัศน์ ฝักเจริญผล] แดงเตรียมตัวไปตั้งแค้มป์ในป่าเขา ดงดิบกับเพื่อนๆ เขาไปเดินเลือกซื้ออุปกรณ์ที่ห้างสรรพสินค้าโชว์ห่วย ในร้านมีอุปกรณ์ตั้งแค้มป์ <math>n \,</math> ชิ้น ผลิตภัณฑ์ชิ้นที่ <math>i \,</math> มีราคา <math>w_i \,</math> บาท
+
[จิตรทัศน์ ฝักเจริญผล] แดงเตรียมตัวไปตั้งแค้มป์ในป่าดงดิบกับเพื่อนๆ เขาไปเดินเลือกซื้ออุปกรณ์ที่ห้างสรรพสินค้าโชว์ห่วย ในร้านมีอุปกรณ์ตั้งแค้มป์ <math>n \,</math> ชิ้น ผลิตภัณฑ์ชิ้นที่ <math>i \,</math> มีราคา <math>w_i \,</math> บาท
  
 
แดงต้องการอุปกรณ์เหล่านี้ เพื่อใช้งานหลายอย่าง เช่น เหลาไม้ ขุดดิน ฟังเพลง เลื่อยไม้ กรองน้ำ ถลุงเหล็ก โม่แป้ง เป็นต้น รวมการใช้งานทั้งหมดมีได้ <math>k \,</math> แบบ
 
แดงต้องการอุปกรณ์เหล่านี้ เพื่อใช้งานหลายอย่าง เช่น เหลาไม้ ขุดดิน ฟังเพลง เลื่อยไม้ กรองน้ำ ถลุงเหล็ก โม่แป้ง เป็นต้น รวมการใช้งานทั้งหมดมีได้ <math>k \,</math> แบบ
แถว 15: แถว 17:
 
ช่วยแดงเลือกเซตของอุปกรณ์ที่จะซื้อเพื่อให้สามารถใช้งานทำงานทุกงานได้ครบ กล่าวคือ สำหรับการใช้งาน <math>j</math> ใดๆ จะต้องมีอุปกรณ์ที่เลือกไปอย่างน้อย <math>1 \,</math> อย่างที่สามารถใช้ทำงาน <math>j \,</math> ได้ นอกจากนี้ให้เลือกโดยใช้เงินน้อยที่สุดด้วย
 
ช่วยแดงเลือกเซตของอุปกรณ์ที่จะซื้อเพื่อให้สามารถใช้งานทำงานทุกงานได้ครบ กล่าวคือ สำหรับการใช้งาน <math>j</math> ใดๆ จะต้องมีอุปกรณ์ที่เลือกไปอย่างน้อย <math>1 \,</math> อย่างที่สามารถใช้ทำงาน <math>j \,</math> ได้ นอกจากนี้ให้เลือกโดยใช้เงินน้อยที่สุดด้วย
  
จงออกแบบอัลกอริทึมเพื่อช่วยแดงแก้ปัญหาข้างต้น อัลกอริทึมของคุณควรใช้เวลาทำงานไม่เกิน <math>O(n 2^n) \,</math>
+
จงออกแบบอัลกอริทึมเพื่อช่วยแดงแก้ปัญหาข้างต้น อัลกอริทึมของคุณควรใช้เวลาทำงานไม่เกิน <math>O(nk 2^n) \,</math>
 +
 
 +
'''หมายเหตุ:''' มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา <math>O(nk 2^k) \,</math>
  
'''หมายเหตุ:''' มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา <math>O(n 2^k) \,</math>
+
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 2|เฉลย]]
  
 
== ข้อ 3 ==
 
== ข้อ 3 ==
แถว 24: แถว 28:
 
# จงออกแบบอัลกอริทึมที่ตอบคำถามดังกล่าวข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n^3) \,</math>
 
# จงออกแบบอัลกอริทึมที่ตอบคำถามดังกล่าวข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n^3) \,</math>
 
# จงแสดงว่าถ้าเราสามารถเรียงจำนวนที่อยู่ในเซต <math>A \,</math> ในเวลา <math>O(f(n)) \,</math> แล้วเราสามารถแก้ปัญหานี้ในเวลา <math>O(f(n) + n) \,</math>
 
# จงแสดงว่าถ้าเราสามารถเรียงจำนวนที่อยู่ในเซต <math>A \,</math> ในเวลา <math>O(f(n)) \,</math> แล้วเราสามารถแก้ปัญหานี้ในเวลา <math>O(f(n) + n) \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 3|เฉลย]]
  
 
== ข้อ 4 ==
 
== ข้อ 4 ==
[ทักษพร กิตติอัครเสถียร, TOI.C:05-2009] กำหนดเซตของจำนวนเต็ม <math>A \,</math> ซึ่งมีสมาชิกอยู่ทั้งหมด <math>n \,</math> ตัว และกำหนดจำนวนเต็ม <math>x \,</math> ให้ เราต้องการตอบคำถามว่า "มีคู่จำนวนเต็ม <math>a, b</math> โดยที่ <math>a, b \in A \,</math> และ <math>a+b = x \,</math> อยู่กี่คู่"
+
[ทักษพร กิตติอัครเสถียร, TOI.C:05-2009] กำหนดเซตของจำนวนเต็ม <math>A \,</math> ซึ่งมีสมาชิกอยู่ทั้งหมด <math>n \,</math> ตัว และกำหนดจำนวนเต็ม <math>x \,</math> ให้ เราต้องการตอบคำถามว่า "มีคู่จำนวนเต็ม <math>a, b \,</math> โดยที่ <math>a, b \in A \,</math> และ <math>a < b \,</math> และ <math>a+b = x \,</math> อยู่กี่คู่"
  
ยกตัวอย่างเช่น ถ้า <math>A = {1, 2, 3, ..., 10} \,</math> และ <math>x = 11 \,</math> แล้วคำตอบของคำถามข้างบนคือ 5 แต่ถ้า <math>x = 19 \,</math> แล้วคำตอบคือ 1
+
ยกตัวอย่างเช่น ถ้า <math>A = {1, 2, 3, ..., 10} \,</math> และ <math>x = 11 \,</math> แล้วคำตอบของคำถามข้างต้นคือ 5 แต่ถ้า <math>x = 19 \,</math> แล้วคำตอบคือ 1
  
 
# จงออกแบบอัลกอริทึมที่ตอบคำถามดังกล่าวข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n^2) \,</math>
 
# จงออกแบบอัลกอริทึมที่ตอบคำถามดังกล่าวข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n^2) \,</math>
 
# จงแสดงว่าถ้าสามารถตอบคำถามว่ามีจำนวนเต็ม <math>y \,</math> อยู่ในเซต <math>A \,</math> หรือไม่ ได้ในเวลา <math>O(f(n)) \,</math> แล้วเราสามารถแก้ปัญหานี้ในเวลา <math>O( n \cdot f(n) ) \,</math>
 
# จงแสดงว่าถ้าสามารถตอบคำถามว่ามีจำนวนเต็ม <math>y \,</math> อยู่ในเซต <math>A \,</math> หรือไม่ ได้ในเวลา <math>O(f(n)) \,</math> แล้วเราสามารถแก้ปัญหานี้ในเวลา <math>O( n \cdot f(n) ) \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 4|เฉลย]]
  
 
== ข้อ 5 ==
 
== ข้อ 5 ==
 
[ข้อสอบคอมพิวเตอร์โอลิมปิกประเทศไทย ประจำปี 2548] ลำดับเลขคณิต (arithmetic sequence) คือลำดับที่ผลต่างของพจน์ที่อยู่ติดกันมีค่าคงที่ เช่น 2, 4, 6, 8, 10, 12 เป็นลำดับเลขคณิตที่มีผลต่างระหว่างพจน์ที่ติดกันเท่ากับ 2 และ 11, 6, 1, -4, -9, -14, -19 เป็นลำดับเลขคณิตที่มีผลต่างระหว่างพจน์ที่ติดกันเท่ากับ -5
 
[ข้อสอบคอมพิวเตอร์โอลิมปิกประเทศไทย ประจำปี 2548] ลำดับเลขคณิต (arithmetic sequence) คือลำดับที่ผลต่างของพจน์ที่อยู่ติดกันมีค่าคงที่ เช่น 2, 4, 6, 8, 10, 12 เป็นลำดับเลขคณิตที่มีผลต่างระหว่างพจน์ที่ติดกันเท่ากับ 2 และ 11, 6, 1, -4, -9, -14, -19 เป็นลำดับเลขคณิตที่มีผลต่างระหว่างพจน์ที่ติดกันเท่ากับ -5
  
กำหนดลำดับ (ที่ไม่จำเป็นต้องเป็นลำดับเลขคณิต) ของจำนวนเต็มลำดับหนึ่งมาให้ โดยลำดับนี้มีความ <math>n \,</math> จงหาลำดับย่อย (หมายถึงพจน์ที่ติดกัน) ของลำดับนี้ที่มีความยาวมากทีุ่สุดและเป็นลำดับเลขคณิต
+
กำหนดลำดับ (ที่ไม่จำเป็นต้องเป็นลำดับเลขคณิต) ของจำนวนเต็มลำดับหนึ่งมาให้ โดยลำดับนี้มีความยาว <math>n \,</math> จงหาลำดับย่อย (หมายถึงพจน์ที่ติดกัน) ของลำดับนี้ที่มีความยาวมากทีุ่สุดและเป็นลำดับเลขคณิต
  
 
ยกตัวอย่างเช่น สมมติว่าลำดับที่ให้มาคือลำดับ 10, 1, 2, 3, 2, 4, 6, 8, 10, 5, 0 เราได้ว่ามีลำดับย่อยของลำดับนี้ที่เป็นลำดับเลขคณิตอยู่หลายลำดับ เช่น 10, <b>1, 2, 3</b>, 2, 4, 6, 8, 10, 5, 0 (ความยาว 3) หรือ 10, 1, 2, 3, 2, 4, 6, 8, <b>10, 5, 0</b> (ความยาว 3) แต่ลำดับย่อยที่เป็นลำดับเลขคณิตที่ยาวที่สุดคือ 10, 1, 2, 3, <b>2, 4, 6, 8, 10</b>, 5, 0 (ความยาว 5)
 
ยกตัวอย่างเช่น สมมติว่าลำดับที่ให้มาคือลำดับ 10, 1, 2, 3, 2, 4, 6, 8, 10, 5, 0 เราได้ว่ามีลำดับย่อยของลำดับนี้ที่เป็นลำดับเลขคณิตอยู่หลายลำดับ เช่น 10, <b>1, 2, 3</b>, 2, 4, 6, 8, 10, 5, 0 (ความยาว 3) หรือ 10, 1, 2, 3, 2, 4, 6, 8, <b>10, 5, 0</b> (ความยาว 3) แต่ลำดับย่อยที่เป็นลำดับเลขคณิตที่ยาวที่สุดคือ 10, 1, 2, 3, <b>2, 4, 6, 8, 10</b>, 5, 0 (ความยาว 5)
  
# จงออกแบบอัลกอริทึมที่แก้ปัญหาข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n^2) \,</math>
+
# จงออกแบบอัลกอริทึมที่แก้ปัญหาข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n^3) \,</math>
 
# จงออกแบบอัลกอริทึมที่แก้ปัญหาข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n) \,</math>
 
# จงออกแบบอัลกอริทึมที่แก้ปัญหาข้างต้นที่มีเวลาการทำงานเท่ากับ <math>\Theta(n) \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 5|เฉลย]]
  
 
== ข้อ 6 ==
 
== ข้อ 6 ==
แถว 66: แถว 76:
 
ถ้า <math>K = 2 \,</math> แล้วกลุ่มบริษัท AoE สามารถเลือกประมูลพื้นที่ซึ่งมีปริมาณน้ำมันสะสมรวมสูงสุด เท่ากับ 100 ได้ แต่ถ้า <math>K = 3 \,</math> แล้ว AoE สามารถเลือกประมูลพื้นที่ที่มีน้ำมันสะสมรวมสูงสุด เท่ากับ 208 ได้
 
ถ้า <math>K = 2 \,</math> แล้วกลุ่มบริษัท AoE สามารถเลือกประมูลพื้นที่ซึ่งมีปริมาณน้ำมันสะสมรวมสูงสุด เท่ากับ 100 ได้ แต่ถ้า <math>K = 3 \,</math> แล้ว AoE สามารถเลือกประมูลพื้นที่ที่มีน้ำมันสะสมรวมสูงสุด เท่ากับ 208 ได้
  
AoE ได้จ้างคุณให้ออกแบบอัลกอริทึมเพื่อหาปริมาณน้ำมันสะสมรวมสูงสุดที่ AoE สามารถประมูลได้ จงออกแบบอัลกอริืึทึมดังกล่าว อัลกอริทึมของคุณควรทำงานภายในเวลา <math>O(N^3 M^3 K^2) \,</math>
+
AoE ได้จ้างคุณให้ออกแบบอัลกอริทึมเพื่อหาปริมาณน้ำมันสะสมรวมสูงสุดที่ AoE สามารถประมูลได้  
 +
# จงออกแบบอัลกอริืึทึมดังกล่าว อัลกอริทึมของคุณควรทำงานด้วยเวลา <math>\Theta(N^3 M^3 K^2) \,</math>
 +
# จงออกแบบอัลกอริืึทึมดังกล่าว อัลกอริทึมของคุณควรทำงานด้วยเวลา <math>\Theta(N^3 M^3) \,</math>
 +
 
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 6|เฉลย]]
  
 
== ข้อ 7 ==
 
== ข้อ 7 ==
แถว 78: แถว 92:
  
 
'''หมายเหตุ:''' มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา <math>O(n \log n) \,</math>
 
'''หมายเหตุ:''' มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา <math>O(n \log n) \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 7|เฉลย]]
  
 
== ข้อ 8 ==
 
== ข้อ 8 ==
กำหนดประพจน์ที่มีตัวแปร <math>x_1, x_2, \ldots, x_n \,</math> (ตัวแปรจะมีไม่มากกว่า <math>n \,</math> ตัว) โดยที่แต่ละตัวมีค่า <math>T \,</math> หรือ <math>F \,</math> และตัวแปรเหล่านี้ถูกประกอบเข้าด้วยกันเป็นประพจน์ด้วยเครื่องหมาย <math>\wedge \,</math>, <math>\vee \,</math>, และ/หรือ <math>\neg \,</math> ยกตัวอย่างเช่น <math>x_1 \wedge (x_2 \vee \neg x_3) \,</math> หรือ <math>(x_1 \vee x_2) \wedge (x_3 \vee x_4 \vee x_5) \,</math> เป็นต้น
+
[Satisfiability Problem] กำหนดประพจน์ที่มีตัวแปร <math>x_1, x_2, \ldots, x_n \,</math> (ตัวแปรจะมีไม่มากกว่า <math>n \,</math> ตัว) โดยที่แต่ละตัวมีค่า <math>T \,</math> หรือ <math>F \,</math> และตัวแปรเหล่านี้ถูกประกอบเข้าด้วยกันเป็นประพจน์ด้วยเครื่องหมาย <math>\wedge \,</math>, <math>\vee \,</math>, และ/หรือ <math>\neg \,</math> ยกตัวอย่างเช่น <math>x_1 \wedge (x_2 \vee \neg x_3) \,</math> หรือ <math>(x_1 \vee x_2) \wedge (x_3 \vee x_4 \vee x_5) \,</math> เป็นต้น
  
 
เราต้องการตอบคำถามว่า "สำหรับประพจน์ที่ให้มา มีวิธีการกำหนดค่าตัวแปรให้ประพจน์มีค่าเป็น <math>T\,</math> หรือไม่?"
 
เราต้องการตอบคำถามว่า "สำหรับประพจน์ที่ให้มา มีวิธีการกำหนดค่าตัวแปรให้ประพจน์มีค่าเป็น <math>T\,</math> หรือไม่?"
  
ยกตัวอย่างเ่ช่น สำหรับประพจน์ <math>x_1 \wedge x_2 \wedge \neg x_3</math> เราสามารถทำให้ประพจน์มีค่าเป็น <math>T\,</math> ได้ด้วยการกำหนดให้ <math>x_1 = T, x_2 = T, x_3 = F</math> ได้ ฉะนั้นคำตอบของคำถามข้างต้นสำหรับประพจน์นี้คือ "ใช่" แต่สำหรับประพจน์ <math>x_1 \wedge \neg x_1 \,</math> แล้ว ไม่ว่าเราจะกำหนดให้ <math>x_1 \,</math> มีค่าเป็นอะไร ประพจน์ก็จะมีค่าเป็น <math>F\,</math> เสมอ ดังนั้นคำตอบของคำถามนี้สำหรับประพจน์ที่สองนี้คือ "ไม่ใช่"
+
ยกตัวอย่างเ่ช่น สำหรับประพจน์ <math>x_1 \wedge x_2 \wedge \neg x_3</math> เราสามารถทำให้ประพจน์มีค่าเป็น <math>T\,</math> ได้ด้วยการกำหนดให้ <math>x_1 = T, x_2 = T, x_3 = F \,</math> ได้ ฉะนั้นคำตอบของคำถามข้างต้นสำหรับประพจน์นี้คือ "ใช่" แต่สำหรับประพจน์ <math>x_1 \wedge \neg x_1 \,</math> แล้ว ไม่ว่าเราจะกำหนดให้ <math>x_1 \,</math> มีค่าเป็นอะไร ประพจน์ก็จะมีค่าเป็น <math>F\,</math> เสมอ ดังนั้นคำตอบของคำถามนี้สำหรับประพจน์ที่สองนี้คือ "ไม่ใช่"
  
 
จงออกแบบอัลกอริทึมสำหรับแก้ปัญหาดังกล่าว อัลกอริทึมของคุณควรทำงานในเวลา <math>O(2^n M) \,</math> เมื่อ <math>M \,</math> คือเวลาที่ใช้ในการคำนวณค่าความจริงของประพจน์ที่กำหนดให้ โดยที่คุณรู้ค่าของตัวแปรทุกตัวแล้ว
 
จงออกแบบอัลกอริทึมสำหรับแก้ปัญหาดังกล่าว อัลกอริทึมของคุณควรทำงานในเวลา <math>O(2^n M) \,</math> เมื่อ <math>M \,</math> คือเวลาที่ใช้ในการคำนวณค่าความจริงของประพจน์ที่กำหนดให้ โดยที่คุณรู้ค่าของตัวแปรทุกตัวแล้ว
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 8|เฉลย]]
  
 
== ข้อ 9 ==
 
== ข้อ 9 ==
แถว 93: แถว 111:
 
เราสามารถคำนวณ''คะแนน''ของตารางได้ดังนี้: สำหรับช่องแต่ละช่องที่ไม่ใช่ช่องที่อยู่ในแถวล่างสุดหรือช่องที่อยู่ในแถวซ้ายสุด  
 
เราสามารถคำนวณ''คะแนน''ของตารางได้ดังนี้: สำหรับช่องแต่ละช่องที่ไม่ใช่ช่องที่อยู่ในแถวล่างสุดหรือช่องที่อยู่ในแถวซ้ายสุด  
 
* ให้หาผลต่างของเลขจำนวนเต็มในช่องนั้นกับช่องที่อยู่ทางด้านซ้ายของมัน แล้วนำผลลัพธ์ที่ได้ไปยกกำลังสอง  
 
* ให้หาผลต่างของเลขจำนวนเต็มในช่องนั้นกับช่องที่อยู่ทางด้านซ้ายของมัน แล้วนำผลลัพธ์ที่ได้ไปยกกำลังสอง  
* ให้หาผลต่างของเลขจำนวนเต็มในช่องนั้นกับช่องที่อยู่ทางด้านขวาของมัน แล้วนำผลลัพธ์ที่ได้ไปยกกำลังสอง
+
* ให้หาผลต่างของเลขจำนวนเต็มในช่องนั้นกับช่องที่อยู่ทางด้านล่างของมัน แล้วนำผลลัพธ์ที่ได้ไปยกกำลังสอง
 
คะแนนของตารางคือผลบวกของเลขทั้งสองตัวข้างบนนี้ สำหรับตารางช่องที่ไม่ใช่ช่องที่อยู่ในแถวล่างสุดหรือช่องที่อยู่ในแถวซ้ายสุดทุกช่อง
 
คะแนนของตารางคือผลบวกของเลขทั้งสองตัวข้างบนนี้ สำหรับตารางช่องที่ไม่ใช่ช่องที่อยู่ในแถวล่างสุดหรือช่องที่อยู่ในแถวซ้ายสุดทุกช่อง
  
แถว 111: แถว 129:
  
 
'''หมายเหตุ:''' มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา <math>O(n^2 2^n) \,</math>
 
'''หมายเหตุ:''' มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา <math>O(n^2 2^n) \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 9|เฉลย]]
 +
 +
== ข้อ 10 ==
 +
[Traveling Salesman Problem] กำหนดจุดมาให้ <math>n \,</math> ในระนาบสองมิติ ให้จุด <math>n \,</math> จุดเหล่านี้มีสัญลักษณ์ <math>(x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n) \,</math>
 +
 +
คุณต้องการเดินทางโดยเริ่มจากจุด <math>(x_1, y_1) \,</math> แล้วไปผ่านจุดอื่นทุกจุด โดยคุณจะเดินเข้าหาจุดแต่ละจุดเพียงครั้งเดียว และออกจากจุดแต่ละจุดเพียงครั้งเดียวเท่านั้น แล้วให้ท้ายที่สุดคุณกลับไปอยู่ที่จุด <math>(x_1, y_1) \,</math> อีกครั้ง การเดินแบบนี้เรียกว่า Hamiltonian Cycle ยกตัวอย่างเช่นตามรูปข้างล่างนี้ (จุด <math>(x_1, y_1) \,</math> จะเป็นจุดใดก็ได้ในจุดหลายๆ จุดข้างล่างนี้)
 +
 +
[[Image:Kortad-rundtur.GIF]]
 +
 +
คุณต้องการหา Hamiltonian Cycle ที่มีระยะทาง'''สั้นที่สุด''' โดยระยะทางของ Hamiltonian Cycle หนึ่งๆ มีค่าเท่ากับผลบวกของความยาวของส่วนของเส้นตรงที่เชื่อมจุดสองจุดที่คุณเดินระหว่างมันในเส้นทาง คุณคงยังจำได้ว่าระยะทางระหว่างจุด <math>(x_i, y_i) \,</math> และ <math>(x_j, y_j) \,</math> มีค่าเท่ากับ <math>\sqrt{(x_i - x_j)^2 + (y_i - y_j)^2} \,</math> ดังนั้นถ้าสมมติให้ <math>n = 4 \,</math> เราจะได้ว่า Hamiltonian Cycle <math>(x_1, y_1) \rightarrow (x_4, y_4) \rightarrow (x_2, y_2) \rightarrow (x_3, y_3) \rightarrow (x_1, y_1) \,</math> มีระยะทางเท่ากับ <math>\sqrt{(x_1 - x_4)^2 + (y_1 - y_4)^2} + \sqrt{(x_4 - x_2)^2 + (y_4 - y_2)^2} + \sqrt{(x_2 - x_3)^2 + (y_2 - y_3)^2} + \sqrt{(x_3 - x_1)^2 + (y_3 - y_1)^2} \,</math>
 +
 +
จงออกแบบอัลกอริืทึมเพื่อแก้ปัญหานี้ อัลกอริทึมของคุณควรทำงานได้ในเวลา <math>O(n!) \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 10|เฉลย]]

รุ่นแก้ไขปัจจุบันเมื่อ 08:56, 21 สิงหาคม 2552

ข้อ 1

[Subset Sum Problem] กำหนดเซตของจำนวนเต็ม ที่มีจำนวนสมาชิกเท่ากับ ตัว และกำหนดจำนวนเต็ม มาให้ เราต้องการตอบคำถามที่ว่่า "มีซับเซต บางซับเซตของ ที่ผลบวกของสมาชิกของมันเท่ากับ หรือไม่?" (กล่าวคือ เราต้องการหาเซต ที่ )

ยกตัวอย่างเช่น ถ้า และ แล้ว คำตอบของคำถามข้างบนคือ "ใ่ช่" เนื่องจากมีซับเซต ที่ผลบวกของมันมีค่าเท่ากับ 20 (ความจริงแล้วยังมีซับเซตอื่นๆ อีกมากมายที่มีผลบวกเท่ากับ 20) ในทางกลับกัน ถ้า แล้วเราไม่สามารถหาซับเซตของ ที่มีผลบวกเท่ากับ ได้เลย (ทำไม?)

จงออกแบบอัลกอริทึมเพื่อแก้ปัญหาข้างต้น อัลกอริทึมของคุณควรใช้เวลาทำงานไม่เกิน

เฉลย

ข้อ 2

[จิตรทัศน์ ฝักเจริญผล] แดงเตรียมตัวไปตั้งแค้มป์ในป่าดงดิบกับเพื่อนๆ เขาไปเดินเลือกซื้ออุปกรณ์ที่ห้างสรรพสินค้าโชว์ห่วย ในร้านมีอุปกรณ์ตั้งแค้มป์ ชิ้น ผลิตภัณฑ์ชิ้นที่ มีราคา บาท

แดงต้องการอุปกรณ์เหล่านี้ เพื่อใช้งานหลายอย่าง เช่น เหลาไม้ ขุดดิน ฟังเพลง เลื่อยไม้ กรองน้ำ ถลุงเหล็ก โม่แป้ง เป็นต้น รวมการใช้งานทั้งหมดมีได้ แบบ

แดงมีข้อมูลว่าอุปกรณ์แต่ละชิ้นทำอะไรได้บ้าง โดยสำหรับอุปกรณ์ที่ และการใช้งานที่ ค่า จะระบุว่า อุปกรณ์ดังกล่าวมีความสามารถใชงานสำหรับงานที่ หรือไม่ กล่าวคือ เมื่ออุปกรณ์ที่ สามารถทำงาน ได้ และ เมื่ออุปกรณ์ชิ้นที่ i ทำไม่ได้

ช่วยแดงเลือกเซตของอุปกรณ์ที่จะซื้อเพื่อให้สามารถใช้งานทำงานทุกงานได้ครบ กล่าวคือ สำหรับการใช้งาน ใดๆ จะต้องมีอุปกรณ์ที่เลือกไปอย่างน้อย อย่างที่สามารถใช้ทำงาน ได้ นอกจากนี้ให้เลือกโดยใช้เงินน้อยที่สุดด้วย

จงออกแบบอัลกอริทึมเพื่อช่วยแดงแก้ปัญหาข้างต้น อัลกอริทึมของคุณควรใช้เวลาทำงานไม่เกิน

หมายเหตุ: มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา

เฉลย

ข้อ 3

[YTOPC Challenge เมษายน 2552] กำหนดเซตของจำนวนเต็ม ซึ่งมีสมาชิกอยู่ทั้งหมด ตัว เราต้องการตอบคำถามว่า "มีจำนวนเต็ม โดยที่ และ หรือไม่?" (กล่าวอีกอย่างหนึ่งคือ สามารถเป็นความยาวด้านของสามเหลี่ยมรูปหนึ่งได้)

  1. จงออกแบบอัลกอริทึมที่ตอบคำถามดังกล่าวข้างต้นที่มีเวลาการทำงานเท่ากับ
  2. จงแสดงว่าถ้าเราสามารถเรียงจำนวนที่อยู่ในเซต ในเวลา แล้วเราสามารถแก้ปัญหานี้ในเวลา

เฉลย

ข้อ 4

[ทักษพร กิตติอัครเสถียร, TOI.C:05-2009] กำหนดเซตของจำนวนเต็ม ซึ่งมีสมาชิกอยู่ทั้งหมด ตัว และกำหนดจำนวนเต็ม ให้ เราต้องการตอบคำถามว่า "มีคู่จำนวนเต็ม โดยที่ และ และ อยู่กี่คู่"

ยกตัวอย่างเช่น ถ้า และ แล้วคำตอบของคำถามข้างต้นคือ 5 แต่ถ้า แล้วคำตอบคือ 1

  1. จงออกแบบอัลกอริทึมที่ตอบคำถามดังกล่าวข้างต้นที่มีเวลาการทำงานเท่ากับ
  2. จงแสดงว่าถ้าสามารถตอบคำถามว่ามีจำนวนเต็ม อยู่ในเซต หรือไม่ ได้ในเวลา แล้วเราสามารถแก้ปัญหานี้ในเวลา

เฉลย

ข้อ 5

[ข้อสอบคอมพิวเตอร์โอลิมปิกประเทศไทย ประจำปี 2548] ลำดับเลขคณิต (arithmetic sequence) คือลำดับที่ผลต่างของพจน์ที่อยู่ติดกันมีค่าคงที่ เช่น 2, 4, 6, 8, 10, 12 เป็นลำดับเลขคณิตที่มีผลต่างระหว่างพจน์ที่ติดกันเท่ากับ 2 และ 11, 6, 1, -4, -9, -14, -19 เป็นลำดับเลขคณิตที่มีผลต่างระหว่างพจน์ที่ติดกันเท่ากับ -5

กำหนดลำดับ (ที่ไม่จำเป็นต้องเป็นลำดับเลขคณิต) ของจำนวนเต็มลำดับหนึ่งมาให้ โดยลำดับนี้มีความยาว จงหาลำดับย่อย (หมายถึงพจน์ที่ติดกัน) ของลำดับนี้ที่มีความยาวมากทีุ่สุดและเป็นลำดับเลขคณิต

ยกตัวอย่างเช่น สมมติว่าลำดับที่ให้มาคือลำดับ 10, 1, 2, 3, 2, 4, 6, 8, 10, 5, 0 เราได้ว่ามีลำดับย่อยของลำดับนี้ที่เป็นลำดับเลขคณิตอยู่หลายลำดับ เช่น 10, 1, 2, 3, 2, 4, 6, 8, 10, 5, 0 (ความยาว 3) หรือ 10, 1, 2, 3, 2, 4, 6, 8, 10, 5, 0 (ความยาว 3) แต่ลำดับย่อยที่เป็นลำดับเลขคณิตที่ยาวที่สุดคือ 10, 1, 2, 3, 2, 4, 6, 8, 10, 5, 0 (ความยาว 5)

  1. จงออกแบบอัลกอริทึมที่แก้ปัญหาข้างต้นที่มีเวลาการทำงานเท่ากับ
  2. จงออกแบบอัลกอริทึมที่แก้ปัญหาข้างต้นที่มีเวลาการทำงานเท่ากับ

เฉลย

ข้อ 6

[APIO 2009] รัฐบาลของเมืองสิรูเสรีตัดสินใจว่าจะมีการประมูลที่ดินซึ่งอุดมไปด้วย น้ำมันในจังหวัดนาวาลูร์ ให้กับบริษัทเอกชนที่สนใจจะมาขุดบ่อน้ำมัน ที่ดินที่จะเอาไปประมูลมีรูปร่างเป็นสี่เหลี่ยมผืนผ้าที่ถูกแบ่งออกเป็นตารางขนาด คูณ ช่อง

ก่อนหน้านี้ หน่วยสำรวจทางธรณีวิทยาของสิรูเสรีได้ประมาณปริมาณน้ำมันสะสมในนาวาลูร์ไว้ ข้อมูลที่สำรวจได้มีรูปแบบเป็นตารางขนาด คูณ ช่อง ที่แต่ละช่องบรรจุจำนวนเต็มหนึ่งค่า ซึ่งเป็นค่าประมาณของปริมาณน้ำมันสะสมในที่ดินช่องนั้น

เพื่อป้องกันการผูกขาดการขุดเจาะน้ำมัน รัฐบาลจึงออกกฎว่าบริษัทแต่ละบริษัทสามารถขอประมูลพื้นที่ซึ่งเป็นสี่เหลี่ยมจัตุรัสขนาด คูณ ช่องได้เท่านั้น

กลุ่มบริษัทน้ำมัน AoE ซึ่งประกอบด้วยบริษัทน้ำมันสามบริษัทเข้าร่วมการประมูลครั้งนี้ด้วย โดยแต่ละบริษัทต้องการที่ดินหนึ่งพื้นผืนซึ่งไม่ซ้อนทับกับที่ดินของบริษัทอื่นในกลุ่ม นอกจากนี้พวกเขายังต้องการให้ที่ดินมีปริมาณน้ำมันสะสมมากที่สุดเท่าที่จะมากได้

ตัวอย่างเช่น สมมติว่าข้อมูลปริมาณน้ำมันสะสมเป็นดังเช่นตารางข้างล่างนี้

1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 1 1 1 8 8 8 1 1
1 1 1 1 1 1 8 8 8
1 1 1 1 1 1 9 9 9
1 1 1 1 1 1 9 9 9

ถ้า แล้วกลุ่มบริษัท AoE สามารถเลือกประมูลพื้นที่ซึ่งมีปริมาณน้ำมันสะสมรวมสูงสุด เท่ากับ 100 ได้ แต่ถ้า แล้ว AoE สามารถเลือกประมูลพื้นที่ที่มีน้ำมันสะสมรวมสูงสุด เท่ากับ 208 ได้

AoE ได้จ้างคุณให้ออกแบบอัลกอริทึมเพื่อหาปริมาณน้ำมันสะสมรวมสูงสุดที่ AoE สามารถประมูลได้

  1. จงออกแบบอัลกอริืึทึมดังกล่าว อัลกอริทึมของคุณควรทำงานด้วยเวลา
  2. จงออกแบบอัลกอริืึทึมดังกล่าว อัลกอริทึมของคุณควรทำงานด้วยเวลา

เฉลย

ข้อ 7

[อาภาพงศ์ จันทร์ทอง, TOI.C:05-2009] เรามีลำดับของจำนวนเต็ม จำนวน แทนด้วย เราต้องการทราบจำนวนของลำดับย่อย (ซึ่ง ) ที่มีพิสัยของลำดับย่อยเป็นจำนวนเต็มที่อยู่ในช่วง ว่ามีกี่ลำดับย่อย

นิยาม: พิสัยของลำดับจำนวนหนึ่ง ๆ คือผลต่างของค่าสูงสุดและต่ำสุดของลำดับดังกล่าว ดังนั้นพิสัยของลำดับย่อย ก็คือ

ตัวอย่างเช่น สมมติลำดับของจำนวนเต็ม 7 ตัวมี 1, 7, 4, 3, 9, 6, 8 พบว่าจะมีลำดับย่อยทั้งหมด 13 ลำดับย่อยที่มีค่าพิสัยอยู่ในช่วงตั้งแต่ 4 ถึง 6 ได้แก่ 1-7-4-3, 1-7-4, 1-7, 7-4-3-9-6-8, 7-4-3-9-6, 7-4-3-9, 7-4-3, 4-3-9-6-8, 4-3-9-6, 4-3-9, 3-9-6-8, 3-9-6 และ 3-9

จงออกแบบอัลกอริทึมสำหรับแก้ปัญหานี้ อัลกอริทึมของคุณควรจะทำงานในเวลา

หมายเหตุ: มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา

เฉลย

ข้อ 8

[Satisfiability Problem] กำหนดประพจน์ที่มีตัวแปร (ตัวแปรจะมีไม่มากกว่า ตัว) โดยที่แต่ละตัวมีค่า หรือ และตัวแปรเหล่านี้ถูกประกอบเข้าด้วยกันเป็นประพจน์ด้วยเครื่องหมาย , , และ/หรือ ยกตัวอย่างเช่น หรือ เป็นต้น

เราต้องการตอบคำถามว่า "สำหรับประพจน์ที่ให้มา มีวิธีการกำหนดค่าตัวแปรให้ประพจน์มีค่าเป็น หรือไม่?"

ยกตัวอย่างเ่ช่น สำหรับประพจน์ เราสามารถทำให้ประพจน์มีค่าเป็น ได้ด้วยการกำหนดให้ ได้ ฉะนั้นคำตอบของคำถามข้างต้นสำหรับประพจน์นี้คือ "ใช่" แต่สำหรับประพจน์ แล้ว ไม่ว่าเราจะกำหนดให้ มีค่าเป็นอะไร ประพจน์ก็จะมีค่าเป็น เสมอ ดังนั้นคำตอบของคำถามนี้สำหรับประพจน์ที่สองนี้คือ "ไม่ใช่"

จงออกแบบอัลกอริทึมสำหรับแก้ปัญหาดังกล่าว อัลกอริทึมของคุณควรทำงานในเวลา เมื่อ คือเวลาที่ใช้ในการคำนวณค่าความจริงของประพจน์ที่กำหนดให้ โดยที่คุณรู้ค่าของตัวแปรทุกตัวแล้ว

เฉลย

ข้อ 9

กำหนดตารางขนาด คูณ มาให้หนึ่งตาราง ตารางแต่ละช่องมีจำนวนเต็มบวกบรรจุดอยู่หนึ่งจำนวน

เราสามารถคำนวณคะแนนของตารางได้ดังนี้: สำหรับช่องแต่ละช่องที่ไม่ใช่ช่องที่อยู่ในแถวล่างสุดหรือช่องที่อยู่ในแถวซ้ายสุด

  • ให้หาผลต่างของเลขจำนวนเต็มในช่องนั้นกับช่องที่อยู่ทางด้านซ้ายของมัน แล้วนำผลลัพธ์ที่ได้ไปยกกำลังสอง
  • ให้หาผลต่างของเลขจำนวนเต็มในช่องนั้นกับช่องที่อยู่ทางด้านล่างของมัน แล้วนำผลลัพธ์ที่ได้ไปยกกำลังสอง

คะแนนของตารางคือผลบวกของเลขทั้งสองตัวข้างบนนี้ สำหรับตารางช่องที่ไม่ใช่ช่องที่อยู่ในแถวล่างสุดหรือช่องที่อยู่ในแถวซ้ายสุดทุกช่อง

ยกตัวอย่างเช่น ตาราง:

5 6 4
2 3 1
8 9 7

มีคะแนนเท่ากับ

คุณต้องการทำให้คะแนนของตารางมีค่าต่ำสุดเท่าที่จะเป็นไปได้ โดยคุณสามารถ

  • สลับแถวของตารางแบบใดก็ได้ แต่เวลาสลับต้องสลับทั้งแถว
  • สลับคอลัมน์ของตารางแบบใดก็ได้ แต่เวลาสลับต้องสลับทั้งคอลัมน์

จงออกแบบอัลกอริทึมเพื่อหาค่าที่ต่ำที่สุดนี้ อัลกอริทึมของคุณควรทำงานในเวลา

หมายเหตุ: มีอัลกอริทึมที่สามารถแก้ปัญหานี้ได้ในเวลา

เฉลย

ข้อ 10

[Traveling Salesman Problem] กำหนดจุดมาให้ ในระนาบสองมิติ ให้จุด จุดเหล่านี้มีสัญลักษณ์

คุณต้องการเดินทางโดยเริ่มจากจุด แล้วไปผ่านจุดอื่นทุกจุด โดยคุณจะเดินเข้าหาจุดแต่ละจุดเพียงครั้งเดียว และออกจากจุดแต่ละจุดเพียงครั้งเดียวเท่านั้น แล้วให้ท้ายที่สุดคุณกลับไปอยู่ที่จุด อีกครั้ง การเดินแบบนี้เรียกว่า Hamiltonian Cycle ยกตัวอย่างเช่นตามรูปข้างล่างนี้ (จุด จะเป็นจุดใดก็ได้ในจุดหลายๆ จุดข้างล่างนี้)

Kortad-rundtur.GIF

คุณต้องการหา Hamiltonian Cycle ที่มีระยะทางสั้นที่สุด โดยระยะทางของ Hamiltonian Cycle หนึ่งๆ มีค่าเท่ากับผลบวกของความยาวของส่วนของเส้นตรงที่เชื่อมจุดสองจุดที่คุณเดินระหว่างมันในเส้นทาง คุณคงยังจำได้ว่าระยะทางระหว่างจุด และ มีค่าเท่ากับ ดังนั้นถ้าสมมติให้ เราจะได้ว่า Hamiltonian Cycle มีระยะทางเท่ากับ

จงออกแบบอัลกอริืทึมเพื่อแก้ปัญหานี้ อัลกอริทึมของคุณควรทำงานได้ในเวลา

เฉลย