B1024 生日快乐 递归。。。
bzoj1024叫生日快乐,其实很简单,但是没看出来就很尴尬。。。
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
代码很短,而且很好理解
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define duke(i,a,n) for(int i = a;i <= n;i++) #define lv(i,a,n) for(int i = a;i >= n;i--) #define clear(a) memset(a,0,sizeof(a)) typedef long long ll; typedef double db; const int INF = 1 << 30; template <class T> void read(T &x) { char c; int op = 0; while(c = getchar(),c > '9' || c < '0') if(c == '-') op = 1; x = c - '0'; while(c = getchar(),c >= '0' && c <= '9') x = x * 10 + c - '0'; if(op == 1) x = -x; } db w,s,l; int p; db solve(db w,db l,int p) { if(p == 1) return max(w,l) / min(w,l); double sum = INF; for (int i = 1; i <= p / 2; ++i) sum = min(sum,min(max(solve(w,l - i * s / w,p - i),solve(w,i * s / w,i)),max(solve(w - i * s / l,l,p - i),solve(i * s / l,l,i)))); return sum; } int main() { scanf("%lf%lf%d",&w,&l,&p); s = l * w /(db)p; printf("%.6lf",solve(w,l,p)); return 0; }
只想找一个不会伤害我的人