P1731 [NOI1999] 生日蛋糕——典型的回溯和剪枝题目,值得一看

news2024/11/27 8:28:05

今天尝试了一下md的编辑器,不知道有没有什么改变

[NOI1999] 生日蛋糕

题目背景

数据加强版 link

题目描述

7 月 17 日是 Mr.W 的生日,ACM-THU 为此要制作一个体积为 N π N\pi Nπ M M M 层生日蛋糕,每层都是一个圆柱体。

设从下往上数第 i i i 1 ≤ i ≤ M 1 \leq i \leq M 1iM)层蛋糕是半径为 R i R_i Ri,高度为 H i H_i Hi 的圆柱。当 i < M i \lt M i<M 时,要求 R i > R i + 1 R_i \gt R_{i+1} Ri>Ri+1 H i > H i + 1 H_i \gt H_{i+1} Hi>Hi+1

由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积 Q Q Q 最小。

请编程对给出的 N N N M M M,找出蛋糕的制作方案(适当的 R i R_i Ri H i H_i Hi 的值),使 S = Q π S=\dfrac{Q}{\pi} S=πQ 最小。

(除 Q Q Q 外,以上所有数据皆为正整数)

输入格式

第一行为一个整数 N N N N ≤ 2 × 1 0 4 N \leq 2 \times 10^4 N2×104),表示待制作的蛋糕的体积为 N π N\pi Nπ

第二行为 M M M M ≤ 15 M \leq 15 M15),表示蛋糕的层数为 M M M

输出格式

输出一个整数 S S S,若无解,输出 0 0 0

样例 #1

样例输入 #1

100
2

样例输出 #1

68

这个题是一道显然的回溯加剪枝的题目,首先我们要把基础的方法写出来,再来剪枝。所以我们很轻松就可以想到这样的解法:
1.枚举层数(从n到1),半径,高度,体积以及面积,在层数达到0并且体积恰好等于n的时候将面积与面积的最小值进行比较,如果比他小就更改。
2.在函数内部枚举半径i和高度h,范围题目已经告诉你了。
3.当已选中一个高度和一个半径的时候,就按照题目的要求进行下一次的递归。
也就是这样

#include<bits/stdc++.h>
using namespace std;

int n,m,minn=INT_MAX;

void dfs(int step,int r,int h,int s,int v){
	if (step==0&&v==n){
		minn=min(s,minn);
		return;
	}
	for (int i=r-1;i>=step;i--){
		if (step==m)s=i*i;//这个地方很重要,一定要记得将下表面存着
		for (int j=h-1;j>=step;j--){
			dfs(step-1,i,j,s+2*i*j,v+i*i*j);
		}
	}
	return;
}
int main(){
	cin>>n>>m;
	dfs(m,n,n,0,0);
	if (minn==INT_MAX)cout<<0;
	else cout<<minn;
	return 0;
}

接下来就是肯定是剪枝了,怎么剪呢?很容易就可以想到如果当前的面积加上往后最小的面积和都要比最小的面积情况大的话,直接退出,同样又有如果当前的v已经大于了n也是直接退出,再有如果当前的v从而算出来的s也是大于最小的面积的话,也是直接退出。代码如下:

#include<bits/stdc++.h>
using namespace std;

int n,m,minn=INT_MAX;
int mins[30000],minv[30000];

void dfs(int step,int r,int h,int s,int v){
	if (step==0){
		if (v==n)minn=min(s,minn);
		return;
	}
	if (s+mins[step-1]>=minn)return;
	if (v+minv[step-1]>n)return;
	if(2.0*(n-v)/r+s>=minn)  return;//要用小数,不能用整数,要不然要出错
	for (int i=r-1;i>=step;i--){
		if (step==m)s=i*i;
		for (int j=h-1;j>=step;j--){
			dfs(step-1,i,j,s+2*i*j,v+i*i*j);
		}
	}
	return;
}
int main(){
	cin>>n>>m;
	for (int i=1;i<=m;i++){
		mins[i]=mins[i-1]+2*i*i;//记录面积的最小
		minv[i]=i*i*i;//记录体积的最小
	}
	dfs(m,n,n,0,0);
	if (minn==INT_MAX)cout<<0;
	else cout<<minn;
	return 0;
}

那么到了这里,基本上函数根本上的优化是没有了,这时候我们就要考虑一下优化循环了:
半径肯定是不能优化了,那么我们就要考虑一下高度了,能不能优化呢?显然是可以的,我们可以用总的体积减去当前的体积和后面最小的体积和再来除以i²得到后面的h并与当前的h进行比较,从而缩短循环的时间,代码如下:

#include<bits/stdc++.h>
using namespace std;

int n,m,minn=INT_MAX;
int mins[30000],minv[30000];

void dfs(int step,int r,int h,int s,int v){
	int maxh=h;
	if (step==0){
		if (v==n)minn=min(s,minn);
		return;
	}
	if (s+mins[step-1]>=minn)return;
	if (v+minv[step-1]>n)return;
	if(2.0*(n-v)/r+s>=minn)  return;
	for (int i=r-1;i>=step;i--){
		if (step==m)s=i*i;
		maxh=min(h-1,(n-minv[step-1]-v)/i/i);
		for (int j=maxh;j>=step;j--){
			dfs(step-1,i,j,s+2*i*j,v+i*i*j);
		}
	}
	return;
}
int main(){
	cin>>n>>m;
	for (int i=1;i<=m;i++){
		mins[i]=mins[i-1]+2*i*i;
		minv[i]=i*i*i;
	}
	dfs(m,n,n,0,0);
	if (minn==INT_MAX)cout<<0;
	else cout<<minn;
	return 0;
}


看了这么久,作者也写了这么久,能不能点一个赞,在收藏一下呢?最好的话在点个关注吧

谢谢啦!​
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node后端上传文件到本地指定文件夹

实现 第一步&#xff0c;引入依赖 const fs require(fs) const multer require(multer) 第二步&#xff0c;先设置一个上传守卫&#xff0c;用于初步拦截异常请求 /*** 上传守卫* param req* param res* param next*/ function uploadFile (req, res, next) {// dest 值…

GD32F470_(4线制)火光/火焰传感器模块火源探测 红外接收传感器 智能车配件

2.16 火焰传感器 红外火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源&#xff0c;在机器人比赛中&#xff0c;远红外火焰探头起到非常重要的作用&#xff0c;它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人等。 红外火焰传感器…

10-热点文章-定时计算

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路&#xff1a;从数据库直接按照发布时间倒序查询 问题1&#xff1a; 如何访问量较大&#xff0c;直接查询数据库&#xff0c;压力较大 问题2&#xff1a; 新发布的文章会展示在前面&#xff0c;并不是热点文章 …

R语言数据操纵:常用函数

目录 处理循环的函数 lapply函数 apply函数 mapply函数 tapply函数 split函数 排序的函数 sort函数与order函数 总结数据信息的函数 head函数与tail函数 summary函数 str函数 table函数 any函数 all函数 xtab函数 object.size函数 这篇文章主要介绍R语言中处理…

全网最全的APP测试面试题(含文档)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f…

Windows的“上帝模式”

Windows操作系统,以其强大的功能和广泛的兼容性深受全球用户喜爱。然而,随着系统功能的日益丰富,许多深度设置和管理选项可能隐藏在层层菜单之下,不易被普通用户迅速找到。为了简化这一过程,微软在Windows Vista之后的版本中引入了一项鲜为人知但极为实用的功能——“上帝…

鸿蒙千帆起~ 是转?还是留?

近期鸿蒙系统相关行业热度一度高涨&#xff0c;像今天2024年1月18日 鸿蒙OS Next开发者预览版正式发布引起了不少业内人士关注&#xff0c;再度冲上了热榜。余承东老余之前就说过2024年是鸿蒙关键的一年&#xff0c;从这句话就可以看出后一定有大的动作。 就像去年有业内人士网…

【Android】App通信基础架构相关类源码解析

应用通信基础架构相关类源码解析 这里主要对Android App开发时&#xff0c;常用到的一些通信基础类进行一下源码的简单分析&#xff0c;包括&#xff1a; Handler&#xff1a;处理器&#xff0c;与某个Looper&#xff08;一个线程对应一个Looper&#xff09;进行关联。用于接…

自动驾驶中的多目标跟踪_第二篇

自动驾驶中的多目标跟踪:第二篇 上一节介绍了多目标跟踪的定义、应用场景和类型以及面临的挑战&#xff1b;在这一节&#xff0c;我们回顾贝叶斯滤波&#xff0c;简单介绍运动模型和量测模型&#xff0c;卡尔曼滤波等。 附赠自动驾驶学习资料和量产经验&#xff1a;链接 贝叶…

【C语言】青蛙跳台阶问题

题目&#xff1a;一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。现求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 题目分析&#xff1a; 当 n 等于 1 时&#xff0c;青蛙只能跳一级台阶到达&#xff0c;因此只有一种跳法&#xff0c;直接返回 1。当 n 等于 2 时…

信用卡客户特征分析

分析思路 信用卡服务提供了一种方便的贷款方式&#xff0c;允许用户事先消费&#xff0c;之后再支付费用。对银行而言&#xff0c;这种服务既有较高的利润潜力&#xff0c;同时也伴随着用户可能不履行还款义务的风险。本⽂是基于2005年台湾信⽤卡客户数据&#xff0c;探究信⽤…

如何区别进化和演化

在生物学中&#xff0c;"进化"和"演化"这两个词通常可以互换使用&#xff0c;它们都指的是生物种群随时间推移而发生的遗传变化。然而&#xff0c;在某些语境中&#xff0c;这两个词可能会有细微的差别&#xff1a; 进化&#xff08;Evolution&#xff09;…

C#.net手术麻醉信息系统源码,集成HIS、EMR、LIS、PACS系统

手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能据如实准确地反映患者生命体征参数的变化&#xff0c;并实现信息高度共享&#xff0c;根据采集结果&#xff0c;综合其他患者数据&#xff0c;自动生成手术麻醉…

MySQL数据库基础--索引

索引概述 索引是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09; 优缺点 优势劣势提高数据检索的效率&#xff0c;降低数据库的IO成本索引列也是要占用空间的通过索引列对数据进行排序&#xff0c;降低数据排序的成本&#xff0c;降低CPU的消耗索引大大提高了查…

xss.pwnfunction-Ah That‘s Hawt

<svg/onloadalert%26%2340%3B1%26%2341%3B> <svg/>是一个自闭合形式 &#xff0c;当页面或元素加载完成时&#xff0c;onload 事件会被触发&#xff0c;从而可以执行相应的 JavaScript 函数

649.Dota2 参议院

题目&#xff1a;Dota2 的世界里有两个阵营&#xff1a;Radiant&#xff08;天辉&#xff09;和 Dire&#xff08;夜魇&#xff09; Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中&am…

abap 增强查找

初代增强 查找&#xff1a;se38 Z_FIND_USEREXIT ZENHANCE_FIND 没有的话可以复制下面查找增强代码 REPORT z_find_userexit NO STANDARD PAGE HEADING.*&---------------------------------------------------------------------**& Enter the transaction code…

机器学习 —— MNIST手写体识别

本文使用工具 Anaconda下载安装与使用 Jupyter Notebook的使用 pytorch配置 Jupyter notebook Pycharm 本文使用数据集 机器学习实验所需内容.zip 点击跳转至正文部分 pytorch配置 Jupyter notebook 1、打开 Anaconda…

Unity MySql安装部署与Unity连接 上篇

1.前言 最近项目用到MySql&#xff0c;记录一下安装部署过程。 数据量过大或者需要管理用户数据的时候用mysql的话数据结构比较清晰明了&#xff0c;便于管理。 2.安装MySql Unity版本&#xff1a;2019.4.16 MySql版本&#xff1a;8.2.0 下载地址&#xff1a;MySql 下载…

全新AI天空任意生成解决方案,颠覆传统换天效果

在数字化时代&#xff0c;影像创作已经成为企业展示品牌形象、传递信息的重要手段。特别是在汽车拍摄和旅行拍摄等场景中&#xff0c;天空作为画面中不可或缺的元素&#xff0c;其表现往往直接关系到作品的质感和吸引力。然而&#xff0c;传统的天空替换技术往往操作繁琐、效果…