大暴力。。。
首先考虑一个问题:如果一个矩形只能向一个方向切n-1刀,让每个矩形的长宽之比最大值最小,应该怎么切?
显然是平均切成n份。
但是这里不要求只能一个方向,我们可以对于一个矩形枚举它切在哪里,递归地处理切成的两个矩形就好了。
/*************************************************************
Problem: bzoj 1024 [SCOI2009]生日快乐
User: fengyuan
Language: C++
Result: Accepted
Time: 160 ms
Memory: 820 kb
Submit_Time: 2017-11-16 21:02:56
*************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const double INF = 1e9;
int n;
double x, y;
inline double dfs(double x, double y, int n)
{
if (x < y) swap(x, y);
if (n == 1) return x/y;
double t = 1/(double)n, ret = INF;
for (int i = 1; i < n; i ++){
ret = min(ret, max(dfs(x, y*t*i, i), dfs(x, y-y*t*i, n-i)));
ret = min(ret, max(dfs(y, x*t*i, i), dfs(y, x-x*t*i, n-i)));
}
return ret;
}
int main()
{
scanf("%lf%lf%d", &x, &y, &n);
printf("%.6lf\n", dfs(x, y, n));
return 0;
}

本文提供了一种解决BZOJ1024[SCOI2009]生日快乐问题的有效算法。通过递归枚举切割位置,并采用动态规划的方式计算最优长宽比,实现了高效的解决方案。

1875

被折叠的 条评论
为什么被折叠?



