BZOJ1024 [SCOI2009]生日快乐

本文版权归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

正解:搜索

解题报告:

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

 //It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <stack>
using namespace std;
typedef long long LL;
int X,Y,n; inline int getint(){
int w=,q=; char c=getchar(); while((c<''||c>'') && c!='-') c=getchar();
if(c=='-') q=,c=getchar(); while (c>=''&&c<='') w=w*+c-'',c=getchar(); return q?-w:w;
} inline double dfs(int num,double x,double y){//需要分成num块,且矩形长宽分别为x,y
if(num==) return max(x,y)/min(x,y); double now=1e20,nowx,nowy;
for(int i=;i<=num/;i++) {//枚举横着或者竖着分成i份
nowx=x/num*i; nowy=y/num*i;//分成
now=min(now,max(dfs(i,nowx,y),dfs(num-i,x-nowx,y)));
now=min(now,max(dfs(i,x,nowy),dfs(num-i,x,y-nowy)));
}
return now;
} inline void work(){
X=getint(); Y=getint(); n=getint();
printf("%.6lf",dfs(n,X,Y));
} int main()
{
work();
return ;
}
上一篇:TC(Total Commander)文件管理神器


下一篇:详解Linux下iptables中的DNAT与SNAT设置(转)