BZOJ 1023 [SCOI2009]生日快乐
1024: [SCOI2009]生日快乐
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 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('\n') 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;}