值得一做》关于一道暴搜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 }

 

posted @ 2016-10-17 17:42  PencilWang  阅读(129)  评论(0编辑  收藏  举报