【题解】生日蛋糕-C++】的更多相关文章

[问题描述] 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外,以上所有数据皆为正整数) [样例输入]…
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外,以上所有数…
题面传送门 如果不懂DFS,请自觉睡觉: 如果不懂剪枝,请自觉睡觉: 啊哈,大家的思路一定和我一样--DFS,找个数组存储半径和高,可是如单单使用DFS不加剪枝的话,10分--20分. 所以,我们来想一想如何剪枝 1.当前的奶油面积+之后的最小奶油面积>现在已求出的的最小奶油面积--果断return: 2.当前的体积>n,return; 3.当前的体积+之后的最大体积<体积总数,果断return: 4.发现每次枚举半径和高时,是从上一个的半径和高,到还剩下的层数.为什么呢,是因为每一层的…
题面 传送门 Solution 搜索每一层的半径和高度,然后加入一些剪枝就好了. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<iostream> #include<map> #define ll long long #de…
洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积就退出 假设剩余所有的体积都用来做下一层那么此时下一层的体积是最大 而半径会最大 从而表面积最小(定理:当体积一定时 半径越大 表面积越小) 每次枚举半径和高时 是从下一层的半径和高到还剩下的层数 因为每层都要比下面大1 代码 #include<iostream> #include<cmat…
每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如何选取上下界呢? 将上一层的高度记作lh,上一层的半径记作lr,则上界很好判断,就是lh−1和lr−1, 底层应该是选取三次根号下20000约为28的范围 现在考虑下界: 自然选取1是会T得很惨的,下界就是最小值嘛,最上面一层的r和h的最小值都是1啊,那还有几层下界就是几啦! 然后来愉快地剪枝: 比…
题目链接 https://www.luogu.org/problemnew/show/P1731 分析 这题真[哔]恶心,加了一堆奇奇怪怪的优化 首先明确一点,半径和高都必须是正整数,意味着它们最小为\(1\) 同时我们通过数学公式可以推得:当剩下体积\(v\)一定时,层数越少面积越小,也就是说, 越趋进一个圆柱面积越小. 于是我们可以预处理出搜索到每一层的最小剩余体积\(miv[i]=miv[i-1]+i^3\) 假设我们从下(第m层)往上(第1层)枚举 那么我们可以列出优化: 设定初始\(r…
题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可行性剪枝考虑/找限制.上下界: 1.考虑当前:当前体积v一定小于总体积N:第i层的半径和高度一定比上一层小(从下往上数层数),同时每次层的高度和半径都>=1(都是正整数). 2.更近一步,考虑未来:预处理出蛋糕制作到第i层之后再制作的蛋糕体积最小的情况,如果当前体积+这种情况>N,显然不能做成蛋糕…
自己想出这题的大佬蒟蒻在这儿%您了 我实在是太弱了,搜索这种辣鸡算法都不会(逃 这题真的是想了好久,每次都会T三个点,我以为我的剪枝已经堆了够多了,结果后来才知道是一个关键剪枝没想到OTZ 先贴代码 #include <bits/stdc++.h> using namespace std; #define rint register int int n, m, ans = 99999999; int ini1[20], ini2[20]; inline void init( void ){ f…
题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层高度,剪掉 3.体积<1,剪掉 4.体积<当前可能的最小体积(我用等差数列求和公式算的--也不知道对不对) 5.神奇剪枝网上看的,当前(剩余体积*2)/上层半径+当前表面积总和>当前搜出的最优解,剪掉 代码很简单,20行 1 #include <iostream> 2 #incl…