生日蛋糕(DFS)(搜索剪枝)生日蛋糕

1277: 生日蛋糕

时间限制: 1 Sec  内存限制: 128 MB
提交: 28  解决: 10
[提交][状态][讨论版]

题目描述

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为nπ的m层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1≤i≤m)层蛋糕是半径为Ri, 高度为hi的圆柱。当i<m时,要求Ri>Ri+1且hi>hi+1。由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小(令Q= Sπ)。

请编程对给出的n和m,找出蛋糕的制作方案(适当的ri和hi的值),使S最小。(除Q外,以上所有数据皆为正整数)

输入

有两行,第一行为n(n≤10000),表示待制作的蛋糕的体积为nπ;第二行为m(m≤20),表示蛋糕的层数为m。

输出

仅一行,是一个正整数S(若无解则S=0)。

样例输入

100
2

样例输出

68

提示

附:圆柱公式

体积V=π (r^2) h

侧面积A’=2 π r h

底面积A=π r^2

来源

#include <iostream>
#include <cmath>
using namespace std;
int n,m,minv[21],mins[21],mn=10000000000;               

void DFS(int i,int v,int s,int r,int h)
{
    if(0==i)
    {
        if(v==n&&s<mn)
        {
            mn=s;
        }
        return;
    }
    if(v+minv[i-1]>n||s+mins[i-1]>mn||s+2*(n-v)/r>=mn)
        return;
    for( int j=r-1;j>=i;j--)
    {
        if(i==m)
            s=j*j;
        for(int k=h-1;k>=i;k--)
        {
            DFS(i-1,v+j*j*k,s+2*j*k,j,k);
        }
    }
}
int main(void)
{
    cin>>n;
    cin>>m;
    minv[0]=mins[0]=0;
    for(int i=1;i<=m;i++)
    {
        minv[i]=minv[i-1]+i*i*i;
        mins[i]=mins[i-1]+2*i*i;
    }
    DFS(m,0,0,(int)sqrt(n),n);
    cout<<mn<<endl;
    return 0;
}  
时间: 2024-08-08 09:41:31

生日蛋糕(DFS)(搜索剪枝)生日蛋糕的相关文章

HDU 1010 Tempter of the Bone 骨头诱惑(AC代码)DFS搜索+剪枝法

参考了别人的思路:将迷宫外围四面都筑墙‘X’.方便减少代码量. 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <math.h> 5 using namespace std; 6 vector<string> v; 7 int n,m; 8 int x_1,y_1,x_2,y_2; 9 bool maze(int x,int y,int t) //目

『生日蛋糕 搜索剪枝』

Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为N×π的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1. 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q = S×π请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小.(除Q外,以上所

【搜索剪枝】HDU 5469 Antonidas

通道 题意:给出1字母树,询问一字符串是否出现在该树中 思路:直接搜索剪枝,有人点分治?写了几发都T了..有人会了教我? 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct Edge { int v, nxt; Edge () { } Edge (int _v, int _n) { v = _v, nxt = _n; } }; const in

USACO/fence8 迭代加深搜索+剪枝

题目链接 迭代加深搜索思想. 枚举答案K,考虑到能否切出K个木头,那么我们当然选最小的K个来切. 1.对于原材料,我们是首选最大的还是最小的?显然,首选大的能够更容易切出,也更容易得到答案. 2.对于目标木头,我们是优先得到最大的还是最小的?显然,由于K个木头我们都要得到,那么当然先把最大的(最难得到的)先得到,这种搜索策略更优. 3.假设总原材料为all,前K个木头总和为sum,那么all-sum就是这一次切割过程中能[浪费]的最大数目.对于一个切剩下的原材料,若它比最小的目标木头还要小,则它

hdu 5024 Wang Xifeng&#39;s Little Plot【暴力dfs,剪枝】

2014年广州网络赛的C题,也是水题.要你在一个地图中找出一条最长的路,这条路要保证最多只能有一个拐角,且只能为90度 我们直接用深搜,枚举每个起点,每个方向进行dfs,再加上剪枝. 但是如果直接写的话,那一定会特别麻烦,再加上方向这一属性也是我们需要考虑的方面,我们将从别的地方到当前点的方向编一个号:往右为0,如下图顺时针顺序编号 (往右下方向为1,往下为2......以此类推) 我们知道了当前点的坐标,来到当前点的方向,以及到目前有没有拐弯,这几个属性之后,就可以记忆化搜索了,用一个四维数组

hdu 5887 搜索+剪枝

Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 687    Accepted Submission(s): 145 Problem Description Collecting one's own plants for use as herbal medicines is perhaps one of t

hdu1455 dfs搜索之凑棍子

原题地址 这道题和poj的拯救少林神棍是一样的题目. 要用给出的小棍凑成等长的棍子,求能凑成的棍子的最小长度. 直观的包里思路就是枚举所有可能的长度,然后不停的测试小棍组合,先把小棍加入组合,然后不合适就推翻这一根小棍,再测试下一个小棍,直到推翻所有的小棍. 在枚举的时候,我们只需从最长的小棍长,枚举到小棍总长的一半就行了.然后如果再不符合的话,那么就说明所有小棍只能组合成一根棍子了. 我原先看过关于poj上拯救少林神棍这道题目的详细讲解.一个DFS搜索题,这里DFS共有四种剪枝方案: 所给出的

poj 2531 搜索剪枝

Network Saboteur Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description A university network is composed of N computers. System administrators gathered informat

hdu 5323 Solve this interesting problem dfs 搜索

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5323 Solve this interesting problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1470    Accepted Submission(s): 420 Problem Description Have you

HDU 1010 Tempter of the Bone(DFS+奇偶性剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 70665    Accepted Submission(s): 19487 Problem Description The doggie found a bone in an ancient maze, which fascinated him a