值得一做》关于一道暴搜BZOJ1024(EASY+)
为什么要写这道题的DP捏?
原因很简单,因为为原来在openjudge上有一道题叫分蛋糕,有一个思路和这道题很像:“分锅”。
分锅:即为考虑计算当前情况的最优解时,把当前状态结果,分散为考虑当前状态的子状态最优解,从而得出当前状态的最优解;因为要得到这一答案,要枚举分配某一变量,所以可以叫这一过程为分锅。
“分锅”这一思路不仅适用于DP,还适用于最优解搜索。
换句话说,“分锅”这一思路适用于一切最优解的计算,所以对于任何求最优解的问题,皆可灵活用这一方法。
所以对于这道题,就是简单的搜索家一个分锅的思想
直接甩题目啦。。。
Description
windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。 windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。这样,要切成 N 块蛋糕,windy必须切 N-1 次。为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。你能帮助windy求出这个比值么?
Input
包含三个整数,X Y N。
Output
包含一个浮点数,保留6位小数。
Sample Input
5 5 5
Sample Output
1.800000
HINT
【数据规模和约定】 100%的数据,满足 1 <= X,Y <= 10000 ; 1 <= N <= 10 。
然后就甩代码啦
1 /************************************************************** 2 Problem: 1024 3 User: PencilWang 4 Language: C++ 5 Result: Accepted 6 Time:12 ms 7 Memory:820 kb 8 ****************************************************************/ 9 10 #include<stdio.h> 11 #include<algorithm> 12 using namespace std; 13 int x,y,n; 14 double dfs(double a,double b,int d) 15 { 16 if(d==1)return max(a/b,b/a); 17 double ans=1e30; 18 for(int i=1;i<=d/2;i++)//这个循环就是用来分锅的 19 { 20 double yy=b*i/d,xx=a*i/d; 21 ans=min(ans,max(dfs(xx,b,i),dfs(a-xx,b,d-i))); 22 ans=min(ans,max(dfs(a,yy,i),dfs(a,b-yy,d-i))); 23 } 24 return ans; 25 } 26 int main() 27 { 28 scanf("%d%d%d",&y,&x,&n); 29 printf("%.6lf",dfs(x,y,n)); 30 return 0; 31 }