1024: [SCOI2009]生日快乐

链接

思路

  好题!

  x,y太大了,直接搜索切在哪里显然会TLE,所以换种方法切。

  由于要求所有的蛋糕必须面积等大,所以在一次切的过程中,不论横切还是竖切,必须切在等分点上,即使切完分成的两份的面积之比 等于 人数之比。

  所以搜索时记录三个变量,蛋糕大小,人数,枚举切的位置。  

  疑惑:开始忘记了m/2,于是就没有输出,感觉也可以输出的吧?

代码

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 
 5 using namespace std;
 6 
 7 double X,Y,n;
 8 
 9 double dfs(double x,double y,int m) {
10     if (m==1) {
11         return max(x/y,y/x);
12     }
13     double ans = 1e9;
14     for (int i=1; i<=(m>>1); ++i) { // -
15         double tx = x*(1.0*i/(1.0*m));
16         ans = min(ans,max(dfs(tx,y,i),dfs(x-tx,y,m-i)));
17     }
18     for (int i=1; i<=(m>>1); ++i) { // -
19         double ty = y*(1.0*i/(1.0*m));
20         ans = min(ans,max(dfs(x,ty,i),dfs(x,y-ty,m-i)));
21     }
22     return ans;
23 }
24 int main() {
25     cin >> X >> Y >> n;
26     printf("%.6lf",dfs(X,Y,n));
27     return 0;
28 }
原文地址:https://www.cnblogs.com/mjtcn/p/8868241.html