【洛谷】【搜索+剪枝】P1731 [NOI1999]生日蛋糕
【题目背景:】
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。
【题目描述:】
设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i<M时,要求 \(R_i > R_{i+1}\) 且 $H_i>H_{i+1}H $。
由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。
令Q= Sπ
请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。
(除Q外,以上所有数据皆为正整数)
【输入格式:】
有两行,第一行为N(N<=20000),表示待制作的蛋糕的体积为Nπ;第二行为M(M<=15),表示蛋糕的层数为M。
【输出格式:】
仅一行,是一个正整数S(若无解则S=0)。
[算法分析:]
就是搜索啊搜索啊搜索,但是要剪枝啊剪枝啊剪枝啊
像我这么弱连这道题的搜索都要调试的人应该是没有几个了..
观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦.
就是每次枚举r和h,如何选取上下界呢?
将上一层的高度记作lh,上一层的半径记作lr,则上界很好判断,就是\(lh-1\)和\(lr-1\),
底层应该是选取\(\sqrt[3]{20000}\)约为28的范围
现在考虑下界:
自然选取1是会T得很惨的,下界就是最小值嘛,最上面一层的\(r\)和\(h\)的最小值都是\(1\)啊,那还有几层下界就是几啦!
然后来愉快地剪枝:
比较好想的剪枝是这两个:
当当前的面积总和已经超过之前的答案时,\(return\)
当当前体积超过了要求的体积时,\(return\)
还有一些剪枝,思维难度也不算高:
当现在的已有体积加上之后的最大(并不是真正的最大,会比最大还要大一些)体还要小于要求的体积时,\(return\)
当当前的已有面积加上之后的最小(自然也是比真正的最小还要小一些)面积比已有答案还要大时,\(return\)
关于搜索顺序的选择:
这个东西..就是一个玄学...一共有\(A_2^2\ A_2^2\)种选择自己试试就好啦(雾
\([Code:]\)
#include<iostream>
#include<cstdio>
#define re register
using namespace std;
int ans = 2e9;
int n, m;
void dfs(int t, int s, int v, int lr, int lh) {
if(s >= ans) return;
if(t == m+1 && v == n) {
ans = min(ans, s);
return;
}
if(v >= n) return;
int k = m - t + 1;
if(k * lr * lr * lh + v < n) return;
if(k * 2 + s > ans) return;
if(t == 1) {
for(re int r=lr; r>=m; --r) {
for(re int h=m; h<=lh; ++h) {
dfs(t + 1, s + r * r + 2 * r * h, v + r * r * h, r, h);
}
}
}
else for(re int r=lr-1; r>=m-t+1; --r) {
for(re int h=m-t+1; h<lh; ++h) {
dfs(t + 1, s + 2 * r * h, v + r * r * h, r, h);
}
}
}
int main() {
scanf("%d%d", &n, &m);
dfs(1, 0, 0, 28, 28);
if(ans == 2e9) puts("0");
else printf("%d\n", ans);
}
【洛谷】【搜索+剪枝】P1731 [NOI1999]生日蛋糕的更多相关文章
- 洛谷——P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 搜索+剪枝 常见的剪枝: 若当前状态+后面所要搜索的最差的状态$>$或是$<$最后的状态,就返回 预处理最差的状态 #include<iost ...
- 洛谷 P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M ...
- C++ 洛谷 P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 一本通上也有. 这TM是一道极其简单的深搜剪枝(DP当然可以的了,这里我只讲深搜). 首先圆柱公式:(有点数学基础都知道) V=πR2H S侧=π2RH S底= ...
- 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)
洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...
- 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕
题目传送门(洛谷) OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...
- 洛谷P1731[NOI1999]生日蛋糕
题目 搜索+剪枝,主要考察细节和搜索的顺序,首先可以发现所有数据均为整数,所以初始化每层的蛋糕R和H是整数,然后从高层向低层搜索,然后预处理出各层向低层的最小面积和体积用来剪枝. 就可以每层从当前最大 ...
- 洛谷 P1731 [NOI1999]生日蛋糕(搜索剪枝)
题目链接 https://www.luogu.org/problemnew/show/P1731 解题思路 既然看不出什么特殊的算法,显然是搜索... dfs(u,v,s,r0,h0)分别表示: u为 ...
- [洛谷P1731][NOI1999]生日蛋糕(dfs)(剪枝)
典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问 ...
- POJ1190 洛谷P1731 NOI1999 生日蛋糕
生日蛋糕(蛋糕是谁?) Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20272 Accepted: 7219 Desc ...
随机推荐
- C# 常用的加密代码参考
1.MD5加密 public static string EncryptString(string source) { string result; if (source == string.Empt ...
- windows server 证书的颁发与IIS证书的使用
最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选中的服务器证书 4.点击[创建证书申请] 5.填写信息 6.下一 ...
- ABP Zero项目入门踩坑
1.下载ABP项目模板, 打开网址https://aspnetboilerplate.com/Templates,选择MultiPage Web Application,输入项目名称和验证码,即可点击 ...
- Redis管道
介绍 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.客户端请求会遵循以下步骤:客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应并将结果返 ...
- [PHP] 算法-把数组排成最小的数的PHP实现
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 解法1 1.数组排序, ...
- 【Java】包,jar包的扫描
包扫描在框架中应用很广泛,在spring中,通过给自己的类加注解的方式,利用spring的包扫描,完成依赖注入. package com.test.package_scanner.core; impo ...
- UDP服务器/客户端代码示例
UDP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...
- canvas-0translate.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- web print
<!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 如何判断一个 APP页面是否是H5页面
1.无网络断开网络,显示404或则错误页面的是H5 2.页面布局a.在手机设置.开发者选项中开启显示布局边界功能:b.进入应用查看布局边界:c.原生应用可以看到各个控件的布局边界,H5只有整个页面的一 ...