1. 程式人生 > >[BZOJ]1024: [SCOI2009]生日快樂

[BZOJ]1024: [SCOI2009]生日快樂

因為今天是同桌生日(兼虐狗節)加上第一次寫部落格,所以就挑了這麼一道(水)題。
題目大意:N個人分一個邊長分別為X和Y的矩形蛋糕,要切N-1刀分成面積相等的N塊,並且每刀都得平行於一塊蛋糕的一條邊來切,我們要求 N塊蛋糕的長邊與短邊的比值的最大值最小。
可以直接算出每個人擁有蛋糕的面積s,然後考慮切一塊長l寬w的蛋糕,因為得順著邊切,所以切完後的2個蛋糕要麼長都為l,要麼寬都為w,並且面積都為s的倍數,所以可以直接列舉落刀點來遞迴求解。

#include <cstdio>
#include <algorithm>
using namespace
std; double w,l,s; int p; double solve(double w,double l,int p) { if(p==1) return max(w,l)/min(w,l); double sum=2e9; 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(void
) { scanf("%lf%lf%d",&w,&l,&p); s=l*w/(double)p; printf("%.6lf",solve(w,l,p)); return 0; }