您的位置:首页 > 其它

BZOJ1024 [SCOI2009]生日快乐

2016-11-14 20:39 323 查看
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

Description

  windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。现在包括windy
,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。windy主刀,每一切只能平行于一块蛋糕
的一边(任意一边),并且必须把这块蛋糕切成两块。这样,要切成 N 块蛋糕,windy必须切 N-1 次。为了使得
每块蛋糕看起来漂亮,我们要求 N块蛋糕的长边与短边的比值的最大值最小。你能帮助windy求出这个比值么?

Input

  包含三个整数,X Y N。1 <= X,Y <= 10000 ; 1 <= N <= 10

Output

  包含一个浮点数,保留6位小数。

Sample Input

5 5 5

Sample Output

1.800000

正解:搜索

解题报告:

  裸搜索题,直接搜索每次横着切还是竖着切,同时均分成多少块。因为每个人的面积相等,所以注意一下,切成两半后必须要保证两边分成的块数之比要等于面积之比,仔细想想就可以想通了。

1 //It is made by ljh2000
2 #include <iostream>
3 #include <cstdlib>
4 #include <cstring>
5 #include <cstdio>
6 #include <cmath>
7 #include <algorithm>
8 #include <ctime>
9 #include <vector>
10 #include <queue>
11 #include <map>
12 #include <set>
13 #include <string>
14 #include <stack>
15 using namespace std;
16 typedef long long LL;
17 int X,Y,n;
18
19 inline int getint(){
20     int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
21     if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
22 }
23
24 inline double dfs(int num,double x,double y){//需要分成num块,且矩形长宽分别为x,y
25     if(num==1) return max(x,y)/min(x,y); double now=1e20,nowx,nowy;
26     for(int i=1;i<=num/2;i++) {//枚举横着或者竖着分成i份
27     nowx=x/num*i; nowy=y/num*i;//分成
28     now=min(now,max(dfs(i,nowx,y),dfs(num-i,x-nowx,y)));
29     now=min(now,max(dfs(i,x,nowy),dfs(num-i,x,y-nowy)));
30     }
31     return now;
32 }
33
34 inline void work(){
35     X=getint(); Y=getint(); n=getint();
36     printf("%.6lf",dfs(n,X,Y));
37 }
38
39 int main()
40 {
41     work();
42     return 0;
43 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: