Problem Specification | Value |
---|---|
Time Limit | 1 Sec |
Memory Limit | 162 MB |
Submit | 2215 |
Solved | 1599 |
Description
windy 的生日到了, 为了庆祝生日, 他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕. 现在包括 windy, 一共有 N 个人来分这块大蛋糕, 要求每个人必须获得相同面积的蛋糕. windy 主刀, 每一切只能平行于一块蛋糕的一边 (任意一边), 并且必须把这块蛋糕切成两块. 这样, 要切成 N 块蛋糕, windy 必须切 N-1 次. 为了使得每块蛋糕看起来漂亮, 我们要求 N 块蛋糕的长边与短边的比值的最大值最小. 你能帮助 windy 求出这个比值么?
Input
包含三个整数, X Y N. 1 <=X, Y <=10000; 1 <=N <=10
Output
包含一个浮点数, 保留 6 位小数.
Sample Input
5 5 5
Sample Output
1.800000
HINT
Source
http: //www. cnblogs. com/HQHQ/p/5612326. html 重要的事说三遍: 相同面积, 相同面积, 相同面积; 于是我就被坑了, 首先想到二分, 然后不知道怎么验证答案, 后来想到一个贪心, 是错的......
于是默默地重新读题, 发现是暴搜就可以了, 毕竟数据范围小.
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef long double lf;
const lf inf = 1e11;
lf dfs(lf x, lf y, int cnt)
{
lf res = inf;
if (cnt == 1)
return max(x / y, y / x);
for (int i = 1; i <= cnt / 2; i++) {
res = min(res, max(dfs(x / cnt * i, y, i), dfs(x / cnt * (cnt - i), y, cnt - i)));
res = min(res, max(dfs(x, y / cnt * i, i), dfs(x, y / cnt * (cnt - i), cnt - i)));
}
return res;
}
int x, y, n;
int main(int argc, char **argv)
{
scanf("%d%d%d", &x, &y, &n);
lf res = dfs(x, y, n);
printf("%.6Lf\n", res);
return 0;
}
from pydatagen import *
x = randrange(1, 10000)
y = randrange(1, 10000)
n = randrange(3, 10)
printf('%d %d %d' % (x, y, n))
fclose()