题意:

     让你制作一个蛋糕,这个蛋糕有m层,而且每层都是圆柱形,并且每一层都必须满足

ri>ri+1 && hi > hi+1,然后给出蛋糕的总体积是n*PI,还有层数m,让你构建一个蛋糕,使得这个蛋糕的总面积(没有底面)S*PI中的S最小,其中S,m,n,ri,hi都是整数(n<=10000,m<=20)。

思路:

      题意的最后一句话是突破口,就是所有的数据都是整数,这样我们可以考虑搜索,就是枚举每一层的r,h,下面来说一下剪枝,这个题目剪枝是关键

(1)r可以直接从sqrt(n)跑,h得从n跑 ,这个只是大致算的

(2)枚举的时候一定要注意,r,h下限不是1,而是剩余的层数+1,因为每层都至少-1

(3)对于每一个状态,求出当前状态的最大体积,如果小于n,那么直接return

(4)对于每一个状态,求出当前状态的最小体积,如果大于n,那么直接return

至于怎么求最大最小体积,要根据ri>ri+1&&hi>hi+1,自己去吧剩下的层数的r,h都构建出来求。别的没什么,题目比较简单,但是做着挺有感觉的。

#include<stdio.h>

#include<math.h>

int ansS ,m ,n;

bool jude(int nowi ,int r ,int h ,int v)

{

    int vv = v + r * r * h;

    for(int i = 1 ;i <= m - nowi  ;i ++)

    {

        vv += i * i * i;

        if(vv > n) return 0;

    }

    for(int i = nowi ;i <= m ;i ++)

    {

        v += r * r * h;

        r -- ,h --;

    }

    if(v < n) return 0;

    return 1;

}

void DFS(int nowi ,int R ,int H ,int nowv ,int nows)

{

    if(nowv > n || ansS && nows > ansS) return ;

    if(nowi == m + 1)

    {

        if(nowv == n)

        if(ansS == 0 || ansS > nows) ansS = nows;

        return ;

    }

    for(int i = R ;i > m - nowi ;i --)

    for(int j = H ;j > m - nowi ;j --)

    {

        int ts = nows + 2 * i * j + i * i;

        if(nowi != 1) ts -=  i * i;

        if(jude(nowi ,i ,j ,nowv))

        DFS(nowi + 1 ,i - 1 ,j - 1 ,nowv + i * i * j ,ts);

    }

    return;

}

int main ()

{

   scanf("%d %d" ,&n ,&m);

   ansS = 0;

   DFS(1 ,int(sqrt(n*1.0)) ,n ,0 ,0);

   printf("%d\n" ,ansS);

   return 0;

}

poj1190深搜 生日蛋糕的更多相关文章

  1. poj1190 生日蛋糕(深搜+剪枝)

    题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到 ...

  2. 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  3. 【笔记】「pj复习」深搜——简单剪枝

    深搜--简单剪枝 说在最前面: 因为马上要 NOIP2020 了,所以菜鸡开始了复习qwq. pj 组 T1 ,T2 肯定要拿到满分的,然后 T3 , T4 拿部分分, T3 拿部分分最常见的做法就是 ...

  4. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  5. 利用深搜和宽搜两种算法解决TreeView控件加载文件的问题。

    利用TreeView控件加载文件,必须遍历处所有的文件和文件夹. 深搜算法用到了递归. using System; using System.Collections.Generic; using Sy ...

  6. 2016弱校联盟十一专场10.3---Similarity of Subtrees(深搜+hash、映射)

    题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52310 problem description Define the depth of a ...

  7. 2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)

    题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem  description In ICPCCamp, there ar ...

  8. 2015暑假多校联合---Cake(深搜)

    题目链接:HDU 5355 http://acm.split.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m s ...

  9. 深搜+回溯 POJ 2676 Sudoku

    POJ 2676 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17627   Accepted: 8538 ...

随机推荐

  1. Java 常见对象 05

    常见对象·正则表达式 和 其他类 正则表达式的概述和简单使用 * A:正则表达式 * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则,有自己的特殊应用 * 作用: ...

  2. ASP.NET Core与Redis搭建一个简易分布式缓存

    ​本文主要介绍了缓存的概念,以及如何在服务器内存中存储内容.今天的目标是利用IDistributedCache来做一些分布式缓存,这样我们就可以横向扩展我们的web应用程序. 在本教程中,我将使用Re ...

  3. P1164_小A点菜(JAVA语言)

    思路 简单动态规划问题 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点" ...

  4. c++ 反汇编 除法优化

    接上篇:<C++反汇编与逆向分析技术揭秘>--算术运算和赋值 printf("argc / 4 = %d\n", argc / 4); printf("arg ...

  5. Spring笔记(五)

    Spring 事务操作 一.事务(概念) 1. 什么是事务 事务是数据库的最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败,那么所有的操作都失败 典型场景: lucy转账100元给mary l ...

  6. 基于sklearn的波士顿房价预测_线性回归学习笔记

    > 以下内容是我在学习https://blog.csdn.net/mingxiaod/article/details/85938251 教程时遇到不懂的问题自己查询并理解的笔记,由于sklear ...

  7. [矩阵乘法]斐波那契数列IV

    [ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I V [矩阵乘法]裴波拉契数列IV [矩阵乘法]裴波拉契数列IV Description 求数列f[n]=f[n-2]+f[n-1]+n+1的第N项, ...

  8. java面试-集合类不安全问题及解决方案

    一.List 1.代码演示 public class ArrayListNotSafeDemo { public static void main(String[] args) { List<S ...

  9. No_leak(ret2ROP + 低字节改写到syscall)

    No_leak 有这种题,题目很短小,只有一个read函数,没有输出函数,这样的题怎么解呢?当然首先想到的是ret2dl,但是那个有点儿复杂.下面我来介绍一种简单的解法. 代码如下: //gcc 1. ...

  10. Java执行groovy脚本的两种方式

    记录Java执行groovy脚本的两种方式,简单粗暴: 一种是通过脚本引擎ScriptEngine提供的eval(String)方法执行脚本内容:一种是执行groovy脚本: 二者都通过Invocab ...