P4160 SCOI2009 生日快樂

2022-03-04 08:01:05 字數 1182 閱讀 9309

windy的生日到了,為了慶祝生日,他的朋友們幫他買了乙個邊長分別為 x 和 y 的矩形蛋糕。

現在包括windy,一共有 n 個人來分這塊大蛋糕,要求每個人必須獲得相同面積的蛋糕。

windy主刀,每一切只能平行於一塊蛋糕的一邊(任意一邊),並且必須把這塊蛋糕切成兩塊。

這樣,要切成 n 塊蛋糕,windy必須切 n-1 次。

為了使得每塊蛋糕看起來漂亮,我們要求 n 塊蛋糕的長邊與短邊的比值的最大值最小。

你能幫助windy求出這個比值麼?

輸入格式:

三個整數,x y n。

輸出格式:

乙個浮點數,保留6位小數。

輸入樣例#1:

5 5 5

輸出樣例#1:

1.800000

100%的資料,滿足 1 <= x,y <= 10000 ; 1 <= n <= 10 。

solution:

本題不需要多想直接$dfs$。

首先我們假設當前的矩形長為$x$,寬為$y$,要分出$k$塊,那麼不難想到分出的一塊的長$mx$最短為$x/k$,寬$my$最短為$y/k$,而且每次切的長度一定是$mx$的倍數或$my$的倍數(很好理解,不是倍數就無法保證切出至少長$mx$的矩形或寬$my$的矩形,可以自行畫圖)。

於是我們遞迴搜尋,每次切長或者寬,在分出的兩塊中取比值的最大值,更新最大值的最小值,返回就$ok$了。

**:

#include#define il inline

#define for(i,a,b) for(double (i)=(a);(i)<=(b);(i)++)

using

namespace

std;

intn,x,y;

il double dfs(double x,double y,int

k)

double ans=233333333,mx=x*1.0/k,my=y*1.0/k,t1,t2;

for(i,

1,k/2

)

return

ans;

}int

main()

P2564 SCOI2009 生日禮物

傳送 預處理 把m個區間合併成乙個大區間 按照橫座標排序即可 思路 因為我們要一段盡可能小的區間包含所有的彩帶種類,我們不防開乙個陣列,記錄當前區間內每種彩帶多有多少個,從 1,1 開始,如果當前彩帶種類1,即說明這是一條新彩帶,彩帶種類 1,當彩帶種類 m時,記錄下當前區間長度,把左端點向右移,把...

SCOI2009 生日禮物

傳送門 本來想用二分的,讀完資料之後,又發現不用了。然而需要開多乙個陣列p pp記錄顏色最近出現的位置,以便進行玄學操作 當達成目標 now en dnow end now e nd 時,if now end while l.col a l p l 因為a l co la l col a l c o...

SCOI2009 生日快樂

windy的生日到了,為了慶祝生日,他的朋友們幫他買了乙個邊長分別為 x 和 y 的矩形蛋糕。現在包括windy 一共有 n 個人來分這塊大蛋糕,要求每個人必須獲得相同面積的蛋糕。windy主刀,每一切只能平行於一塊蛋糕 的一邊 任意一邊 並且必須把這塊蛋糕切成兩塊。這樣,要切成 n 塊蛋糕,win...