From ad99e253db87409b96e7bd5516b764b2c633d552 Mon Sep 17 00:00:00 2001 From: "phluenam@gmail.com" Date: Wed, 25 Oct 2023 22:44:46 +0800 Subject: [PATCH] add_1139 --- md/1139.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 md/1139.md diff --git a/md/1139.md b/md/1139.md new file mode 100644 index 0000000..fcd062b --- /dev/null +++ b/md/1139.md @@ -0,0 +1,39 @@ +โจทย์ข้อนี้กำหนดให้มีหออยู่ $N$ หอ โดยแต่ละหอมีพิกัด $x_i$ กับ $y_i$ และมีนักเรียน $s_i$ คน โจทย์ต้องการให้หาว่าหากเลือกพิกัด $x$ $y$ ให้ดีที่สุดจะทำให้ $\Sigma_i s_i (| x_i - x| + |y_i - y|)$ ได้ต่ำสุดเท่าไหร่ + +สำหรับข้อนี้สามารถสังเกตว่า $\Sigma_i s_i * (| x_i - x| + |y_i - y|) = \Sigma_i s_i | x_i - x| + \Sigma_i s_i |y_i - y|$ จึงสามารถพิจารณาระยะทางในพิกัด $x$ กับพิกัด $y$ แยกกันในการหาคำตอบ + +### ค่ามัธยฐาน + +คุณสมบัติที่สำคัญที่ต้องใช้การแก้ข้อนี้คือ $\Sigma_{i=1}^N | a_i - a|$ จะมีค่าต่ำสุดเมื่อเลือก $a$ เป็นค่ามัธยฐานของ $(a_1, a_2, \dots, a_N)$ โดยนิยามค่ามัธยฐาน $m$ เป็นค่าที่ทำให้มีจำนวน $a_i$ ที่ไม่น้อยกว่า $m$ อย่างน้อยครึ่ง และจำนวน $a_i$ ที่มีค่าไม่เกิน $m$ อย่างน้อยครึ่ง (ตามนิยามนี้อาจมีค่ามัธยฐานมากกว่า 1 ค่า เช่น สำหรับ $1, 2, 3, 4, 5, 6$ ทั้ง $3, 4$ และ $3.5$ ต่างเป็นค่ามัธยฐาน) + +เนื่องจากข้อนี้ยังมีค่า $s_i$ ที่ต้องพิจารณาด้วยเราจะพิสูจน์ว่าพิกัด $x$ ที่ต้องการคือค่า $m$ ที่ทำให้ $\Sigma_{i,m \leq x_i} s_i \geq \frac{\Sigma_i s_i}{2}$ และ $\Sigma_{i,m \geq x_i} s_i \geq \frac{\Sigma_i s_i}{2}$ กล่าวคือนักเรียนที่อยู่ที่พิกัด $x$ ที่ไม่น้อยกว่า $m$ มีอย่างน้อยครึ่ง และไม่มากกว่า $m$ อย่างน้อยครึ่ง + +สำหรับการหา $\Sigma_i s_i | x_i - m|$ สังเกตว่า $\Sigma_i s_i | x_i - m| = \Sigma_{i,m \geq x_i} s_i (m - x_i) +\Sigma_{i,m < x_i} s_i (x_i -m) $ สมมติว่า $\Sigma_{i,m \geq x_i} s_i < \Sigma_{i,m < x_i} s_i $ จะได้ว่าถ้าเพิ่มค่า $m$ เป็น $m + \epsilon$ โดยที่ $0< \epsilon < \min_{x_i x_{pivot}$ (สำหรับหอที่มีค่า $x$ เท่ากันให้สุ่มว่าจะไว้กลุ่มแรกหรือหลังแบบสุ่มครึ่งครึ่ง) ให้ $p$ เป็นจำนวนหอในกลุ่มแรกบวก 1 สามารถเอา pivot ไปไว้ที่ตำแหน่ง $A[p]$ และสลับกลุ่มแรกมาไว้ใน $A[b..(p-1)]$ และกลุ่มหลังไว้ใน $A[(p+1)..e]$ จะทำให้ทุกหอใน $A[b..(p-1)]$ มีพิกัด $x$ ไม่เกิน $x_{pivot}$ และใน $A[(p+1)..e]$ ไม่ต่ำกว่า $x_{pivot}$ + 3. ให้ผลรวม $s_i$ ในกลุ่มหน้าเป็น $S_{front}$ และในกลุ่มหลังเป็น $S_{back}$ ถ้า $S_{front} \geq k$ ให้ Quickselect ค่าที่ $k$ ใน $A[b..(p-1)]$ และ return ค่าที่ได้ ถ้า $S_{back} > k$ ให้ Quickselect ค่าที่ $k - s_{pivot} - S_{back}$ ใน $A[(p+1)..e]$ หากไม่เข้าทั้งสองกรณีให้ return ค่า $x_{pivot}$ เพราะจะเป็นค่าที่เป็นอันดับ $k$ แล้ว + +สังเกตว่าขั้นตอนวิธีนี้มี Worst Case Time Complexity $\mathcal{O}(N^2)$ เช่นเดียวกับ Quicksort เช่นหากเลือกหอที่มี $x$ ต่ำสุดในทุกรอบ อย่างไรก็ตามเราสามารถพิสูจน์ว่า Expected Time Complexity ของขั้นตอนวิธีนี้เป็นเพียง $\mathcal{O}(N)$ + +ให้เวลาที่ขั้นตอนวิธีนี้ใช้สำหรับ $N$ ค่าเป็น $T(N)$ จะได้ recurrence ว่า $E[T(N)] = \frac{1}{N}\Sigma_{i=1}^N E[T(i)] + \mathcal{O}(N) $ โดย $E[T(1)] = T(1) = 1$ ซึ่งจะพิสูจน์โดย induction ได้ว่า $E[T(N)] = \mathcal{O}(N)$ (เพราะจะได้ $E[T(N)] = \frac{1}{N}\Sigma_{i=1}^N E[T(i)] + \mathcal{O}(N) + = \frac{1}{N}\Sigma_{i=1}^N \mathcal{O}(i)+ \mathcal{O}(N) \leq \frac{1}{N}\Sigma_{i=1}^N Ci+ \mathcal{O}(N) = \frac{C \frac{N(N-1)}{2}}{N} + \mathcal{O}(N) = C\frac{N-1}{2} + \mathcal{O}(N) = \mathcal{O}(N)$ ) + +### Solution + +เมื่อรู้แล้วว่าค่า $x$ และ $y$ ที่จะทำให้ระยะทางต่ำสุดเป็นค่ามัธยฐานของพิกัดนักเรียนในแต่ละแกน เราสามารถใช้ Quickselect เลือกค่า $x$ และ $y$ ดังกล่าวและคำนวน $ \Sigma_i s_i | x_i - x| + \Sigma_i s_i |y_i - y|$ โดยตรง โดยทั้งหมดใช้ Expected Time Complexity $\mathcal{O}(N)$ \ No newline at end of file