From 331ab379afd3767c3f918ebc03c087ed7142f787 Mon Sep 17 00:00:00 2001 From: vzsky Date: Thu, 7 Aug 2025 20:36:51 +0700 Subject: [PATCH] Add 0031 --- md/0031.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 md/0031.md diff --git a/md/0031.md b/md/0031.md new file mode 100644 index 0000000..03458a8 --- /dev/null +++ b/md/0031.md @@ -0,0 +1,25 @@ +เราจะสร้างฟังก์ชั่นเรียกตัวเองชื่อว่า `cutting_times` ที่รับขนาดของด้านทั้งสามด้าน แล้วตอบจำนวนครั้งที่ตัดได้ ขั้นแรกหากทั้งสามด้านเป็นหนึ่ง เราจะตัดไม่ได้แล้ว เพราะฉะนั้นฟังก์ชั่นจะรีเทิร์นค่า 0 + +หากมีด้านที่ไม่เป็น 1 เราจะเลือกด้านที่ยาวที่สุดมาตัดครึ่ง ให้ทั้งสามด้านเป็น $s_0, s_1, s_2$ โดยที่ $s_0 \le s_1 \le s_2$ เมื่อตัดแล้วจะได้ก้อนใหม่ที่มีด้านเป็น $s_0, s_1, \left\lfloor\frac{s_2}{2}\right\rfloor$ ดังนั้นจำนวนครั้งการตัดทั้งหมดคือ $1 + \text{cutting\_times}(s_0, s_1, \left\lfloor\frac{s_2}{2}\right\rfloor)$ + +สังเกตว่าค่าขนาดของวุ้นที่ใส่ในฟังก์ชั่นจะลดลงเรื่อย ๆ ทุกครั้งที่ฟังก์ชั่นเรียกตัวเอง และในที่สุดขนาดของวุ้นจะกลายเป็น $1 \times 1 \times 1$ + +```cpp +#include +using namespace std; + +int cutting_times (int * sizes) { + sort(sizes, sizes+3); + if (sizes[2] == 1) return 0; + sizes[2] = sizes[2] / 2; + return 1 + cutting_times(sizes); +} + +int main () { + int sizes[3]; + for (int i = 0; i < 3; i++) cin >> sizes[i]; + cout << cutting_times(sizes); + return 0; +} + +```