Thử thách
Origami (gấp giấy) là một hình thức nghệ thuật sáng tạo. Theo tôi biết, chủ nhân của Origami thích giấy vuông. Hãy bắt đầu lại từ đầu - chuyển đổi một tờ giấy hình chữ nhật thành một hình vuông.
Vì vậy, giấy được chia thành hình vuông. Chúng tôi xóa hình vuông lớn nhất chia sẻ một cạnh ngắn hơn với hình dạng hiện tại, từng bước một (xem hình dưới đây). Và nếu phần còn lại sau một bước nhỏ hơn hoặc bằng 0.001 * (area of the original paper)
, thì tờ giấy không thể được chia thêm nữa. Có thể là không có gì còn lại cuối cùng.
Nhiệm vụ của bạn là tính toán có bao nhiêu hình vuông được thực hiện trong quá trình. Hình vuông ở bước cuối cùng làm cho giấy không thể phân chia được tính vào đầu ra.
Ví dụ (một tờ giấy có 1.350
chiều rộng / chiều cao), đầu ra là 10:
Đầu vào và đầu ra
Đầu vào: tỷ lệ chiều rộng / chiều cao cho giấy hình chữ nhật, một số thập phân (hoặc số nguyên không có dấu chấm) từ 1.002
đến 1.999
với một bước tối thiểu là0.001
. Bạn cũng có thể sử dụng bất kỳ định dạng hợp lý khác mô tả tỷ lệ. Chỉ cần đề cập đến nó trong câu trả lời của bạn.
Đầu ra: số vuông, một số nguyên.
Ví dụ I / O
Một định dạng ánh xạ được sử dụng để giữ cho trang gọn gàng, trong khi mã của bạn không cần hỗ trợ đầu vào danh sách cũng không phải là chức năng ánh xạ.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Danh sách tất cả các câu trả lời
Cảm ơn @LuisMendo, đây là biểu đồ câu trả lời.
Nhận xét
- Đây là một môn đánh gôn nên mã ngắn nhất sẽ thắng
- Chú ý đến sơ hở tiêu chuẩn
- Bạn có quyền tự do quyết định cách xử lý đầu vào và đầu ra nhưng họ phải tuân theo các hạn chế tiêu chuẩn.
Nhân tiện...
- Nhận xét nếu bạn có bất cứ điều gì không rõ ràng về thử thách
- Cá nhân tôi sẽ đề nghị câu trả lời của bạn chứa một lời giải thích nếu bạn đang sử dụng ngôn ngữ chơi gôn
- Cảm ơn @GregMartin, hãy đọc câu trả lời của anh ấy để có lời giải thích toán học tốt cho thử thách.
Mã ví dụ
Đây là phiên bản không mã hóa của mã C ++:
#include <iostream>
#include <utility>
int f (double m)
{
double n = 1, k = 0.001;
int cnt = 0;
k *= m; // the target minimum size
while(m*n >= k)
{
m -= n; // extract a square
if(n > m)
std::swap(n, m); // keep m > n
++ cnt;
}
return cnt;
}
int main()
{
double p;
std::cin >> p;
std::cout << f(p);
return 0;
}
Tất cả các tính toán liên quan trong mã ví dụ cần độ chính xác 6 chữ số thập phân, được trình bày trong float
.