Skip to content

Latest commit

 

History

History
25 lines (19 loc) · 1.83 KB

File metadata and controls

25 lines (19 loc) · 1.83 KB

เราจะสร้างฟังก์ชั่นเรียกตัวเองชื่อว่า 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$

#include<bits/stdc++.h>
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;
}