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 }