洛谷P1731 [NOI1999]生日蛋糕(爆搜)
时间:2022-06-04
本文章向大家介绍洛谷P1731 [NOI1999]生日蛋糕(爆搜),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目背景
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层
生日蛋糕,每层都是一个圆柱体。
设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i<M时,要求 R_i>R_{i+1}Ri>Ri+1 且 H_i>H_{i+1}Hi>Hi+1 。
由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。
令Q= Sπ
请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。
(除Q外,以上所有数据皆为正整数)
题目描述
输入输出格式
输入格式:
有两行,第一行为N(N<=20000),表示待制作的蛋糕的体积为Nπ;第二行为M(M<=15),表示蛋糕的层数为M。
输出格式:
仅一行,是一个正整数S(若无解则S=0)。
输入输出样例
输入样例#1: 复制
100
2
输出样例#1: 复制
68
emmmm不会做。。。
直到看了标签是“搜索”。。。
那就开心的搜吧。。
可以推出式子
$$N = sum_{i = 1}^M R_i * R_i * H_i$$
$$S = R_1^2 + 2 * sum_{i = 1}^M R_i H_i$$
时间复杂度:$O(玄学)$
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define LL long long
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e9 + 10;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M;
int H[16], R[16];
int ans = INF;
void dfs(int now, int sum, int nowans) {
if(sum > N || (nowans + R[1] * R[1]) > ans) return ;
if(now == M + 1) {
if(sum == N)
ans = min(ans, nowans + R[1] * R[1]);
return ;
}
if(sum + R[now - 1] * R[now - 1] * H[now - 1] * (M - now + 1) < N) return ;
//如果后面都用最大的体积仍然不能达到要求
if(nowans + (M - now + 1) + R[1] * R[1] > ans) return ;
//加上最小的仍然大于答案
for(int i = M - now + 1; i < H[now - 1]; i++) {
for(int j = M - now + 1; j < R[now - 1]; j++) {
H[now] = i; R[now] = j;
dfs(now + 1, sum + R[now] * R[now] * H[now], nowans + 2 * R[now] * H[now]);
H[now] = 0; R[now] = 0;
}
}
}
main() {
#ifdef WIN32
//freopen("a.in", "r", stdin);
#endif
N = read(); M = read();
H[0] = sqrt(N); R[0] = sqrt(N);
dfs(1, 0, 0);
printf("%d", ans == INF ? 0 : ans);
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法