【每日一题】 [SCOI2009]生日快乐

[SCOI2009]生日快乐

https://ac.nowcoder.com/acm/problem/20272

递归

数据范围较小,直接递归解决。
考虑将当前蛋糕分成left块:
当left==1时,返回长与宽的比值;
当left>1时,若沿着当前蛋糕的某一条边切割总共有n/2种切割方法(考虑对称性),沿着长和宽总共有(n/2)*2种切割方法;对于当前蛋糕的每一种切割方法,递归考虑其切割后的两个蛋糕,得到二者切割后能够生成的小蛋糕中长宽比值最大者(从一种切割方法生成的n块蛋糕中找到长宽比值最大的一块);对于当前蛋糕的所有切割方法,从中选出每种比值最大的小蛋糕的最小比值,返回该比值。

值得注意的是,对于递归中生成的所有最小蛋糕,不能一味取其最大比值或最小比值;要分清楚递归过程中,哪些步骤是在选择切分方法(取最小),哪些步骤是在切分(取最大)。

代码:

#include <iostream>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cctype>
#include <functional>
#include <string>
#include <cstring>
#include <sstream>
#include <deque>
#define fir first
#define sec second
using namespace std;

typedef long long ll;
typedef pair<int,int> P;
typedef pair<P,int> Q;

const int inf1=2e9+9;
const ll inf2=8e18+9;
const ll mol=11e9+7;
const int maxn=1e5+9;
const ll maxx=1e12+9;

int x,y,n;
double arc;

double dfs(int left,double a,double b)
{
    if(a>b) swap(a,b);
    if(left==1) return b/a;
    double tmp=inf1;
    double la=arc/a,lb=arc/b;
    for(int i=1;i<=left/2;i++)
        tmp=min(tmp,max(dfs(i,la*i,a),dfs(left-i,b-la*i,a)));
    for(int i=1;i<=left/2;i++)
        tmp=min(tmp,max(dfs(i,lb*i,b),dfs(left-i,a-lb*i,b)));
    return tmp;
}
int main()
{
    scanf("%d%d%d",&x,&y,&n);
    arc=x*y*1.0/n;
    printf("%.6lf\n",dfs(n,x,y));
}
全部评论

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务