每一切只能平行於一塊蛋糕的一邊(任意一邊),並且必須把這塊蛋糕切成兩塊。
這樣,要切成 n
塊蛋糕,
必須切
n-1
次。為了使得每塊蛋糕看起來漂亮,我們要求 n
塊蛋糕的長邊與短邊的比值的最大值最小。
求出這個比值。
最大最小≈二分答案。。。。
然後搜尋判定,dfs(xx,yy,limit,nn)表示要把長寬為xx,yy切成nn塊蛋糕,答案不超過limit是否可行。
view code
1program
cake(input,output);
2var
3x,y,n:longint;
4answer:double;
5s:double;
6procedure
init;
7begin
8readln(x,y,n);
9 s:=x*y/n;
10end;11
12function
max(aa,bb:double):double;
13begin
14if aa>bb then
15exit(aa);
16exit(bb);
17end;18
19function
min(aa,bb:double):double;
20begin
21if aathen
22exit(aa);
23exit(bb);
24end;25
26function
can(xx,yy,limit:double;nn:integer):boolean;
27var
28i,j :longint;
29x1,y1,x2,y2:double;
30begin
31if nn=1
then
32begin
33if max(xx,yy)/min(xx,yy)<=limit then
34exit(true);
35exit(false);
36end;37
for i:=1
to nn>>1
do38
begin
39 x1:=s*i/yy;
40 x2:=s*(nn-i)/yy;
41 can:=can(x1,yy,limit,i) and can(x2,yy,limit,nn-i);
42if can then
43exit;
44 y1:=s*i/xx;
45 y2:=s*(nn-i)/xx;
46 can:=can(xx,y1,limit,i) and can(xx,y2,limit,nn-i);
47if can then
48exit;
49end;50
exit(false);
51end;52
procedure
main;
53var
54ll,rr,mid:double;
55begin
56 ll:=0.00000000
;57 rr:=99999999999;58
while rr-ll>1e-7
do59
begin
60 mid:=(ll+rr)/2;61
if can(x,y,mid,n) then
62 rr:=mid
63else
64 ll:=mid;
65end
;66 writeln(rr:0:6
);67
end;
68begin
69 assign(input,'
cake.in
');reset(input);
70 assign(output,'
cake.out
');rewrite(output);
71init;
72main;
73close(input);
74close(output);
75end.
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...
SCOI2009 生日快樂(搜尋)
description windy的生日到了,為了慶祝生日,他的朋友們幫他買了乙個邊長分別為 x 和 y 的矩形蛋糕。現在包括windy,一共有 n 個人來分這塊大蛋糕,要求每個人必須獲得相同面積的蛋糕。windy主刀,每一切只能平行於一塊蛋糕的一邊 任意一邊 並且必須把這塊蛋糕切成兩塊。這樣,要切...