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

今天尝试了一下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;
}


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

scrapy 爬取m3u8视频

scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址&#xff1a;[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…

鸿蒙OS开发实战:【自动化测试框架】使用指南

概述 为支撑HarmonyOS操作系统的自动化测试活动开展&#xff0c;我们提供了支持JS/TS语言的单元及UI测试框架&#xff0c;支持开发者针对应用接口进行单元测试&#xff0c;并且可基于UI操作进行UI自动化脚本的编写。 本指南重点介绍自动化测试框架的主要功能&#xff0c;同时…

基于Java+SpringBoot+Vue文学名著分享系统(源码+文档+部署+讲解)

一.系统概述 随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理…

深入探索实时音视频技术:RTC程序设计权威指南

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

BUUCTF刷题十一道(12)SSTI专题一

文章目录 学习文章[Flask]SSTI[GWCTF 2019]你的名字[第三章 web进阶]SSTI[pasecactf_2019]flask_ssti[NewStarCTF 公开赛赛道]BabySSTI_One[Dest0g3 520迎新赛]EasySSTI[NewStarCTF 公开赛赛道]BabySSTI_Two[NewStarCTF 公开赛赛道]BabySSTI_Three[GYCTF2020]FlaskApp[CSCCTF 2…

java基础语法(13)

1. final关键字 final概述 学习了继承后&#xff0c;我们知道&#xff0c;子类可以在父类的基础上改写父类内容&#xff0c;比如&#xff0c;方法重写。那么我们能不能随意的继承API中提供的类&#xff0c;改写其内容呢&#xff1f;显然这是不合适的。为了避免这种随意改写的情…

关于转义符 \ 在php正则中的匹配问题

今天做题遇到一个很经典的问题&#xff0c;记录一下&#xff0c;先看一段代码 <?php $str&#xff0c;&#xff0c;"\\"; $pattern&#xff0c;&#xff0c;"/\\/"; if(preg_match($partern,$str,$arr)) { &#xff0c;&#xff0c;&#xff0c;&…

结构型模式--1.适配器模式【托尼托尼·乔巴】

1. 翻译家 在海贼王中&#xff0c;托尼托尼乔巴&#xff08;Tony Tony Chopper&#xff09;是草帽海贼团的船医&#xff0c;它本来是一头驯鹿&#xff0c;但是误食了动物系人人果实之后可以变成人的形态。 乔巴吃了恶魔果实之后的战斗力暂且抛开不谈&#xff0c;说说它掌握的第…

金仓数据库Kingbase的数据库开发管理工具KStudio连接乱码

背景&#xff1a; 金仓数据库V8R6&#xff0c;KStudio在Windows10上运行&#xff0c;JDK8 问题&#xff1a; 使用客户端连接数据库时&#xff0c;提示信息乱码&#xff0c;首选项设置字符集不管用&#xff0c;具体如下图所示&#xff1a; Before&#xff1a; After&#xff1…

018——红外遥控模块驱动开发(基于HS0038和I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 协议 二、 驱动代码 三、 应用代码 四、 实验 五、 程序优化 一、 模块介绍 1.1 简介 红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中&#xff0c;像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和…

【On Hold】又一本ESCI被紧急On Hold!!年发文量激增19倍令人匪夷所思

【SciencePub学术】前几日Hindawi撤稿事件闹得沸沸扬扬&#xff0c;整个学术界的关注点都在这次的撤稿事件。所有的期刊都进入自检模式&#xff0c;官方在审核期刊资质时也颇为严格了。 但是经小编查阅资料时发现&#xff0c;最近有一本ESCI期刊又被科睿唯安官方打上了On Hold…

基于SpringBoot+Vue的“漫画之家”系统(源码+文档+部署+讲解)

一.系统概述 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理…

【Shell】循环语句基础

Shell 循环 循环语句 Shell 循环循环的定义for 循环for循环的C语言格式 while 循环until 循环 循环的定义 循环在编程中通常指循环结构。 循环结构是编程中的一种控制结构&#xff0c;它允许代码在满足特定条件时重复执行一段特定的指令集合&#xff0c;这部分重复执行的代码…

ADP-2-20+ 信号调节 20MHz-2GHzRF功分器 合路器

ADP-2-20 是一款由Mini-Circuits公司出产的功分器&#xff08;power divider&#xff09;。这款功分器的工作温度规模为-40C至85C&#xff0c;贮存温度规模为-55C至100C。作为分路器&#xff0c;它的电源输入最高可达1W&#xff0c;内部功耗最大为0.125W。假如超越这些限制&…

BFS宽度优先搜索例题(蓝桥杯)——逃跑的牛

问题描述&#xff1a; 农夫John的一头牛逃跑了&#xff0c;他想要将逃跑的牛找回来。现假设农夫John和牛的位置都在一条直线上&#xff0c;农夫John的初始位置为N&#xff08;0≤N≤100,000&#xff09;&#xff0c;牛的初始位置为K&#xff08;0≤K≤100,000&#xff09;。农夫…

人社大赛算法赛题解题思路分享+季军+三马一曹团队

团队成员介绍: 梅鵾 上海交通大学 众安科技 算法工程师 吴栋梁 复旦大学 众安科技 算法工程师 李玉娇 复旦大学 众安科技 算法工程师 一、赛题背景分析及理解 本赛题提供了部分地区2016年度的医疗保险就医结…

改进YOLOv8注意力系列七:结合空间关系增强注意力SGE、SKAttention动态尺度注意力、TripletAttention

改进YOLOv8注意力系列七:结合空间关系增强注意力SGE、SKAttention动态尺度注意力、全局上下文信息注意力Triplet Attention 代码Spatial Group Enhance (SGE)SKAttention动态尺度注意力全局上下文信息注意力Triplet Attention(无参)加入方法各种yaml加入结构本文提供了改进 Y…

openGauss 5.0 单点企业版部署_Centos7_x86(上)

背景 通过openGauss提供的脚本安装时&#xff0c;只允许在单台物理机部署一个数据库系统。如果您需要在单台物理机部署多个数据库系统&#xff0c;建议您通过命令行安装&#xff0c;不需要通过openGauss提供的安装脚本执行安装。 本文档环境&#xff1a;CentOS7.9 x86_64 4G1…

IDEA import时不使用*

在使用 IDEA 进行开发时&#xff0c;会经常使用到 import 关键字导入所需的类。 IDEA 默认设置是同包类是超过 5 个或者静态导入超过 3 个变成 import xxx.*。 但 import xxx.* 的形式会造成一些用不到的类被引入&#xff0c;导致资源浪费&#xff0c;最好还是不使用这种方式…

雷达学习之多普勒频率

一、多普勒频率如何产生&#xff1f; 雷达的原理是发射一些无线电脉冲来探测目标&#xff0c;并通过回波的延时来计算目标与雷达的距离&#xff0c;但当目标为运动物体时&#xff0c;在回波向目标传输的同时&#xff0c;目标也会远离或接近回波&#xff0c;所以会导致回波信号…