P1731 [NOI1999]生日蛋糕 搜索+剪枝 常见的剪枝: 若当前状态+后面所要搜索的最差的状态$>$或是$<$最后的状态,就返回 预处理最差的状态 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; //const double pi=3.1415926535…
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,找…
P1731 [NOI1999]生日蛋糕 一本通上也有. 这TM是一道极其简单的深搜剪枝(DP当然可以的了,这里我只讲深搜). 首先圆柱公式:(有点数学基础都知道) V=πR2H S侧=π2RH S底=πR2 状态描述: 用( i , Ri-1 , Hi-1 , Vi-1 , Si-1 ) i表示打算去做第i层, 已知第i-1层蛋糕的半径和高:Ri-1 ,Hi-1 已知做完第i-1层蛋糕后剩下的蛋糕体积和获得的蛋糕表面积:Vi-1 , Si-1 初始状态:(1,R0,H0,n,0) 目标状态:(m…
洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积就退出 假设剩余所有的体积都用来做下一层那么此时下一层的体积是最大 而半径会最大 从而表面积最小(定理:当体积一定时 半径越大 表面积越小) 每次枚举半径和高时 是从下一层的半径和高到还剩下的层数 因为每层都要比下面大1 代码 #include<iostream> #include<cmat…
题目传送门(洛谷)  OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态求出来的答案还要大,那么我们就没有必要搜下去,直接return. 2.如果有某个状态,在这之后假设所有答案都是最优,还比我们当前已经求出来的最小值大,那么哇哦们也没有必要搜下去,return; 3.如果在某个状态之后,所有层蛋糕都用最大体积,也无法达到答案体积,那么也没必要搜,return. 以上三…
题目 搜索+剪枝,主要考察细节和搜索的顺序,首先可以发现所有数据均为整数,所以初始化每层的蛋糕R和H是整数,然后从高层向低层搜索,然后预处理出各层向低层的最小面积和体积用来剪枝. 就可以每层从当前最大半径向最小半径枚举,并分类讨论加剪枝即可. #include <bits/stdc++.h> using namespace std; int n, m, S[1001], V[1001];//最小面积和体积 struct cak { int R, H, CS, S, V; }data[1001]…
题目链接 https://www.luogu.org/problemnew/show/P1731 解题思路 既然看不出什么特殊的算法,显然是搜索... dfs(u,v,s,r0,h0)分别表示: u为已经搜完的层数,v是现在的体积(不包括这一层),s是现在的表面积(所求的)(不包括这一层),r0是当前层的最大半径,h0是当前层的最大高度. 不加剪枝的dfs...(TLE!!!!) 本题的难点 剪枝 剪枝1:搜索到每一层时,如果当前的体积加上剩下层(包含当前层)的最小体积还是大于要求的总体积时,必…
[题目背景:] 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的值),…
典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问题中,搜索树的各个层次.各个分支之间的顺序是不固定的.不同的搜索顺序会产生不同的搜索树形态,其规模大小也相差甚远.因此,我们可以采用排序.更改等手段来优化时间或者空间上的复杂度,借此来优化我们的程序. .排除等效冗余 在搜索过程中,如果我们能够判定从搜索树的当前节点沿着某几条不同的分支到达的子树是等…
生日蛋糕(蛋糕是谁?) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20272   Accepted: 7219 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1. 由于要在蛋糕上抹…
题目背景 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和H…
每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如何选取上下界呢? 将上一层的高度记作lh,上一层的半径记作lr,则上界很好判断,就是lh−1和lr−1, 底层应该是选取三次根号下20000约为28的范围 现在考虑下界: 自然选取1是会T得很惨的,下界就是最小值嘛,最上面一层的r和h的最小值都是1啊,那还有几层下界就是几啦! 然后来愉快地剪枝: 比…
题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i<M时,要求Ri>Ri+1 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q= Sπ 请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小. (除Q外,以上所有数据皆为正整数) 题目描述 输入格式 有两行,第一行为N…
洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50的木棍 首先我们可以想到枚举每个小木棍的长度来搜索 但是直接枚举肯定会超时的 所以我们想到优化剪枝 因为要组成木棍肯定要从被砍开的木棍中的最大值开始枚举到所有木棍总和长(只有一根木棍被砍开) 然而这样却还不是最优的剪枝 因为每根原始小木棍的长度一样 所以枚举长度的时候可以判断是否被总和整除 而且我们…
/*洛谷 1731 生日蛋糕 傻傻的-1 T成了傻逼*/ #include<cstdio> #include<iostream> #include<cmath> #define inf 1e17 #define maxn 20 #define ll long long using namespace std; ll n,m,ans=inf,a[maxn],b[maxn]; void Dfs(ll now,ll V,ll S,ll h,ll r){ ll res=m-no…
洛谷题目传送门 顺便提一下题意有一个地方不太清楚,就是如果输出No还要输出最少需要添加多少张牌才能满足要求.蒟蒻考完以后发现四个点Too short on line 2... 比较需要技巧的搜索 既然是同一个花色要连续,那就枚举每一个花色在哪一段区间连续并选中四个区间,累计每个点数的选中次数. 最后来一个\(O(13)\)的\(\text{check}\),首先每个点数选中次数要不少于已有的个数.接着,只有所有点数的选中次数和已有点数相等时,才能判为'Yes',然后统计某张牌的花色的区间未包含这…
[洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情况(从反过来是一样的) 然后把所有方法分类之后发现实际上只有\(4\)种决策. 而\(4\)种决策中,两两一组,可以发现对于后面结果的影响是相同的, 那么只需要贪心的考虑选择两种决策的较优值. 所以只剩下两种方法了,直接爆搜+最优性剪枝,拿个二进制什么的状压一下计算贡献, 时间复杂度\(O(2^{n…
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格 高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字.每个数字在每…
洛谷P1463:https://www.luogu.org/problemnew/show/P1463 思路 约数个数公式  ai为质因数分解的质数的指数 定理: 设m=2a1*3a2*...*pak(其中p为第k大的质数)是Antiprime数 则必有a1≥a2≥a3≥...≥ak≥0 因此如果有两个值约数个数相同 则要取值比较小的那个 剪枝: 有了这个定理我们就可以搜索质数的指数 由于231已经远远超过数据规模 因此我们只需要搜到31层 质因子的个数最多只有10个(所有质因子相乘得到他们可以…
[NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为\(R_i\), 高度为\(H_i\)的圆柱.当i<M时,要求 \(R_i>R_{i+1}\) 且 \(H_i>H_{i+1}\) . 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q= Sπ 请编程对给出的N和M,找出蛋糕的制作方案…
洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续枚举其它更小的值时,显然可能情况更少,且同样凑不完. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; const i…
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解.请编一个程序找出所有跳棋放置的解.并把它们以上面的序列方法输出.解按字典顺序排列.请输出前3个解.最后一行是解的总个数. //以下的…
枚举 #include <iostream> using namespace std; int main() { ; cin >> k; ; i < ; i++) { ) { ) * ; ; j <; j++) { ) { ) * ; ; l < ; l++) { ) { cout << i << j << l << endl; flag = ; } } } } } } % k == ) { cout <<…
题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E KL KK E E KL KK KV 其含义为: L+L=L,L+K=K,L+V=V,L+E=E K+L=K,K+K=V,K+V=E,K+E=KL -- E+E=KV 根据这些规则可推导出:L=0,K=1,V=2,E=3 同时可以确定该表表示的是4进制加法 //感谢lxylxy123456同学为本题新加一组数据 输入…
题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 我们定一个f[u][k]数组为从当前节点u还剩时间k到达终点的方案 原来从u走到终点的最短路径消耗时间为dis[u] 而我们现在考虑走(u,v,w)这条边(不是最短路) 那么比走最短路需要多dis[v]+w-dis[u]的时间 所以f[u][k]=∑f[v][k-(dis[v]+w-dis[u])]…
洛谷P1074:https://www.luogu.org/problemnew/show/P1074 思路 这道题一看就是DFS 打一个分数表方便后面算分 我用x y z数组分别表示行 列 宫 是否有放置数字 用cnt结构体中no和zero分别表示每行行号和每行的零的数量(下面会讲到为什么) 我们把每行按照零的数量从小到大排序 并保留行号来计算(因为搜索的层数与每行0的个数有关) 我们用一个队列q表示有几个点要枚举 然后我们从零最少的那行开始枚举就ok了 PS:ans一开始要赋值为-1 因为有…
洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然发现了一个0提交0通过的题目,然后就引发了整个机房的兴趣,,然后,,就变成了16提交7通过,, 初看上去这题目就是记忆化搜索,但是环的存在使得普通的记忆化会导致漏解,继续观察发现整张图为n个点n条边,即是多个基环外向树,使用tarjan找到图中的环,显然可知,对于环上一点,能取到的最大值是环的长度,…
科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007]科比的比赛 也可以贪心+网络流+状压dp 这道题其实真的不是很难的 为什么一直没有人做(其实我也是看到科比才进来的...) 入正题吧 思路一:贪心 爆搜肯定过不了对吧 看一下题目,发现这个\(m\)好大八大 再仔细看一下题目,发现\(n\)给的很舒服啊 于是有一个大胆的想法:复杂度和\(n\)有关,…
洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求解可以组合的重量种类数.简单dp求解.复杂度为 \(O(n\times n\times m)\) . 时间复杂度为 \(O(n^m \times n\times n \times m)\) .实际复杂度应该比这个小很多,剪枝效果明显. #include<stdio.h> #include<s…
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #include<math.h> #include<algorithm> using namespace std; const int maxn = 10; const double pi = acos(-1.0); int vis[maxn]; double x[maxn], y[maxn…