BZOJ 1023 [SCOI2009]生日快乐

1024: [SCOI2009]生日快乐

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1729  Solved: 1219
[Submit][Status][Discuss]

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 。

Source

题解:刚从病痛中挣扎出来就碰上这种题,心情大好呀~

窝萌看到面积要相等,那么每次切完的面积必然是1/n的整数倍吧?那么爆搜好了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(' ')
 8 #define ENT putchar('
')
 9 using namespace std;
10 double dfs(double x,double y,int n){
11     double ans=10001.0;
12     if(x<y)swap(x,y);if(n==1)return x/y;
13     for(int i=1;i<n;i++){
14         ans=min(ans,max(dfs(x/n*i,y,i),dfs(x/n*(n-i),y,n-i)));
15         ans=min(ans,max(dfs(y/n*i,x,i),dfs(y/n*(n-i),x,n-i)));
16     }return ans;
17 }
18 inline int read(){
19     int x=0,sig=1;char ch=getchar();
20     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
21     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
22     return x*=sig;
23 }
24 inline void write(int x){
25     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
26     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
27     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
28 }
29 double x,y;int n;
30 void init(){
31     x=read();y=read();n=read();
32     printf("%.6lf",dfs(x,y,n));
33     return;
34 }
35 void work(){
36     return;
37 }
38 void print(){
39     return;
40 }
41 int main(){init();work();print();return 0;}
原文地址:https://www.cnblogs.com/chxer/p/4658861.html