【BZOJ】【1024】【SCOI2009】生日快乐

枚举



  想到以后一秒钟变水题……

  一开始我想:这不是可以随便切吗……但是突然想到:第一刀,必须切在n等分点上!因为要求最后每块的大小相等,那么同理,比如总共要切成7块,第一刀切成了$\frac{3}{7}$和$\frac{4}{7}$两部分,那么后面再切的时候就必须在三等分点和四等分点上切!

  所以dfs一下,枚举是在长边上切还是短边上切,以及是在第几个n等分点上切就可以了……→_→

对了,当n==1的时候得特判一下,ans=长边/短边。我WA在第一个点上就是因为这个……(一开始居然会想着n=1的时候ans=1.000000我也是醉了……)

 1 /**************************************************************
 2     Problem: 1024
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:16 ms
 7     Memory:804 kb
 8 ****************************************************************/
 9
10 //BZOJ 1024
11 #include<cstdio>
12 #include<algorithm>
13 #define F(i,j,n) for(int i=j;i<=n;++i)
14 using namespace std;
15 int n;
16 double dfs(double x,double y,int n){
17     if (x<y) swap(x,y);
18     if (n==1) return x/y;
19     else{
20         double ans=1e16;
21         F(i,1,n/2){
22             ans=min(ans,max(dfs(x*i/n,y,i),dfs(x*(n-i)/n,y,n-i)));
23             ans=min(ans,max(dfs(x,y*i/n,i),dfs(x,y*(n-i)/n,n-i)));
24         }
25         return ans;
26     }
27 }
28 int main(){
29     double x,y,ans=1e16;
30     scanf("%lf%lf%d",&x,&y,&n);
31     if (x<y) swap(x,y);
32     if (n==1) ans=x/y;
33     else F(i,1,n/2){
34         ans=min(ans,max(dfs(x*i/n,y,i),dfs(x*(n-i)/n,y,n-i)));
35         ans=min(ans,max(dfs(x,y*i/n,i),dfs(x,y*(n-i)/n,n-i)));
36     }
37     printf("%.6lf\n",ans);
38     return 0;
39 }

1024: [SCOI2009]生日快乐

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1622  Solved: 1134
[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

[Submit][Status][Discuss]

时间: 2024-10-28 19:51:34

【BZOJ】【1024】【SCOI2009】生日快乐的相关文章

BZOJ 1024: [SCOI2009]生日快乐 dfs

1024: [SCOI2009]生日快乐 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1024 Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕. windy主刀,每一切只能平行于一块蛋糕的一边(任意一边

BZOJ 1024 [SCOI2009]生日快乐 (搜索)

1024: [SCOI2009]生日快乐 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3025  Solved: 2201[Submit][Status][Discuss] Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕.windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这

bzoj 1024 SCOI2009 生日快乐

一上来没思路…… 但是由于每块蛋糕面积相等,又因为每次切必须切成两半,所以每半的面积都是每块蛋糕面积的倍数. 枚举切下来的蛋糕应该还被分为多少块蛋糕,计算切割的地方,分X 和 Y, 递归搜索. 上代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <cmath> #de

[BZOJ 1024][SCOI2009]生日快乐(DFS)

Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy ,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕.windy主刀,每一切只能平行于一块蛋糕 的一边(任意一边),并且必须把这块蛋糕切成两块.这样,要切成 N 块蛋糕,windy必须切 N-1 次.为了使得 每块蛋糕看起来漂亮,我们要求 N块蛋糕的长边与短边的比值的最大值最小.你能帮助windy求出这个比值么? Solution 爆搜可过 #i

1024: [SCOI2009]生日快乐——爆搜

http://www.lydsy.com/JudgeOnline/problem.php?id=1024 对于一个矩形要么横着切,要么竖着切,对于竖着切的时候,枚举左半矩形的块数,横着也一样. #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> const int maxn = 11000; const double INF = 0x3f3f3f3f; u

1024: [SCOI2009]生日快乐

暴力题,N<=10,没注意到平均分,读题真是.. 我们对于一个矩形分成两块进行搜.然后求较大值. ans=min(ans,max(dfs(x,y/n*i,i),dfs(x,y/n*(n-i),n-i): 就是分成两块,分别递归的样子. 1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<math.h> 5 #include<iostream> 6

bzoj千题计划115:bzoj1024: [SCOI2009]生日快乐

http://www.lydsy.com/JudgeOnline/problem.php?id=1024 枚举横着切还是竖着切,一边儿分多少块 #include<cstdio> #include<algorithm> using namespace std; double S; double dfs(double x,double y,int n) { if(n==1) return max(x,y)/min(x,y); double ans=1e9; for(int i=1;i&

矩阵乘法专题1——bzoj 1297 [SCOI2009] 迷路题解

题目链接 题意:给两个长度分别为n和m的序列,现在有两种操作:1.分别选择两个序列的一个非空前缀,切两个前缀的最后一位相同,删除之,得到1分(只累计),消耗e:2.直接删除两个序列,消耗值定于两个序列之前删除的元素个数之和,并且使得得到的分有效(之前没有有效分) 分析: 首先,问题其实就是转化成,进行若干次操作1,然后进行操作2 还要找到一个判别标准,来评判较优的状态(贪心) 每次的消耗值比较大,其实可以计算出最大的删除次数,这个值不是很大 状态表示: 简单的,一个状态可以表示为串A的位置.串B

BZOJ 1296: [SCOI2009]粉刷匠

BZOJ 1296: [SCOI2009]粉刷匠 Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被粉刷一次. 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷. Input 输入文件paint.in第一行包含三个整数,N M T. 接下来有N行,每行一个长度为M的字符串,

SCOI2009生日快乐

竟然是搜索……囧 还以为是什么神题…… 1 uses math; 2 var x,y:extended; 3 n:longint; 4 function find(x,y:extended;z:longint):extended; 5 var i:longint; 6 r1,r2:extended; 7 begin 8 find:=10000000; 9 if z=1 then 10 begin 11 if x>y then exit(x/y) else exit(y/x); 12 end; 1