[題解](搜索)生日蛋糕(NOI1999)
搜索剪枝,
1.枚舉上下界:
先$R\subset$$(dep,min(\lfloor\sqrt{n-v}\rfloor,lastr-1))$
后$H\subset$$(dep,min((n-v)/R^{2},lasth-1))$
由$\pi R^{2}H=\pi(n-v)$可以推出來,R那裡沒有除H是因為H最小為1
2.優化搜索順序:倒序以減小枚舉規模,應該會更快
3.不太複雜的預估(可行性剪枝
預處理出$1$~$dep-1$層的最小體積前綴和,最小側面積前綴和,每次加一下和$n、ans$比較
4.比較複雜的預估(最優性剪枝
單獨判斷s和v還不太夠,他們之間也有一些約束關係,
$1$~$dep-1$層的體積可表示為$n-v=\sum_{k=1}^{dep-1} h[k]*r[k]^{2}$
表面積可表示為$2\sum_{k=1}^{dep-1} h[k]*r[k]$
因為
$2\sum_{k=1}^{dep-1} h[k]*r[k]=\frac{2}{r[dep]} * \sum_{k=1}^{dep-1} h[k]*r[k]*r[dep] \geqslant \frac{2}{r[dep]} * \sum_{k=1}^{dep-1} * h[k] * r[k]^{2} \geqslant \frac{2(n-v)}{r[dep]}$
所以當$\frac{2(n-v)}{r[dep]}+s$大於答案時剪枝
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=;
int n,m,ans=;
int smv[maxn],sms[maxn];//最小體積和,最小側面積和
void dfs(int dep,int s,int v,int lstr,int lsth){
if(dep==){
if(v==n)ans=min(ans,s);return;
}
if(v+smv[dep]>n)return;
if(s+sms[dep]>ans)return;
if(s+*(n-v)/lstr>ans)return;
for(int r=min((int)sqrt(n-v),lstr-);r>=dep;r--){
if(dep==m)s=r*r;
for(int h=min((n-v)/(r*r),lsth-);h>=dep;h--){
dfs(dep-,s+*r*h,v+r*r*h,r,h);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
sms[i]=sms[i-]+*i*i;
smv[i]=smv[i-]+i*i*i;
}
dfs(m,,,sqrt(n),n);
if(ans==)printf("");
else printf("%d",ans);
}
($LaTeX$首使用
[題解](搜索)生日蛋糕(NOI1999)的更多相关文章
- [題解]luogu_P1120小木棍(搜索)
好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相 ...
- [題解](水/數學)luogu_P1147連續自然數和
尺取法a掉 然而數學解法為 等差數列求和公式: sum(L,R)=(L+R)(R-L+1)/2=M 即(L+R)(R-L+1)=2M 可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1&l ...
- [題解](單調隊列dp)【2016noip福建夏令營】探險
P1917 -- 探险 时间限制:1000MS 内存限制:131072KB 题目描述(explore.cpp) π+e去遗迹探险,遗迹里有 N 个宝箱,有的装满了珠宝,有的装着废品. π+e ...
- [題解](最小生成樹/LCA)luogu_P1967貨車運輸
一道好題不出所料又抄的題解 1.首先對於這張圖肯定要考慮走哪些邊不走哪些邊,發現我們想要的肯定那些邊權最大的邊,所以想到最大生成樹 這樣能保證選到盡量大的邊 2.跑完最大生成樹后每兩點之間就有唯一路徑 ...
- [題解](最小生成樹)luogu_P1265
首先考虑最小生成树的模型,唯一不同的是第二种情形. 即“三个或三个以上的城市申请修建的公路成环” 考虑该情形,因为修路的申请是申请离它最近的城市,所以上述条件实质上为 “存在三个或三个以上的城市,他们 ...
- [題解](二分答案/單調隊列)luogu_P1419尋找段落
果然又抄的題解... 顯然答案具有單調性,而對于平均數計算的式子我們移一下項, 若s[l..r]>mid*(r-l+1)无解, 於是我們把每個數都減去一個mid,看和的正負即可,如果為正就可能有 ...
- [題解](最短路)luogu_P1119災後重建
一道好題,然而看題解做的...... floyed的實質:只經過前k個點i到j的最短路,原狀態轉移方程為 f [ k ] [ i ] [ j ]=min( f[ k-1 ] [ i ] [ j ],f ...
- [題解]luogu_P1854 花店櫥窗佈置
來源:題解 一開始看不懂題目,一萬年了終於看懂 f [ i ] [ j ] 表示第i朵花放在第j個花瓶中最大美學值,(花是必須用完嗎?) 顯然放i-1朵花至少要放到前i-1個瓶子里,最多放到前j-1個 ...
- [題解]luogu_P1052 過河
來源:題解 不發題面 因為 l 範圍太大,而石子數卻很少,步數也僅僅在1~10之間, 也就是說兩個石子之間很有可能間隔很大的距離,不管怎麼跳都能跳過去,那麼中間那些怎麼樣都能跳過去的區間和沒有等價, ...
- [題解]luogu_P3205/BZOJ_1996 合唱隊
前言:基本上發題解的都是抄的題解所以 來源:題解 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个 ...
随机推荐
- 制作SD卡img文件,并扩容
/********************************************************************************** * raspi-config E ...
- 将tomcat7解压版注册为windows系统服务
一.修改service.bat文件(...tomcat7\bin\service.bat) 该文件中共修改两处即可 ①:在文件的开头加入以下设置,分别是java的安装路径.Tomcat的安装路径及服务 ...
- Gym - 100851J: Jump(交互+构造+(大胆瞎搞)))
题意:给定长度为N的01串,现在让你猜这个串,猜的次数要不超过N+500次. 每次你猜一个串,系统会返回N/2,或N,或0.当且当有N/2个位置猜对,N个位置猜对,其他. 思路:因为信息不多,没有关联 ...
- @@cursor_rows变量解析
刚刚看了@@curosr_rows这个全局变量,发现这个变量挺有意思.要懂得这个变量的意义,基本上牵扯到cursor一些比较容易忽视的内容. @@cursor_rows是用来记录当前游标的数量,也就从 ...
- uoj problem 31 猪猪侠再战括号序列
题目大意: 给定一个长度为2n的括号序列.定义一个关于区间[l,r]的翻转操作为位置平移对调. 即翻转")))()("可以得到"()()))((" 用不超过n次 ...
- 【caffe】卷积层代码解析
1.Forward_cpu conv_layer.cpp template <typename Dtype> void ConvolutionLayer<Dtype>::For ...
- influxdb api
https://influxdb-python.readthedocs.io/en/latest/examples.html
- 网络编程之socket编程
TCP/IP协议 网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程 ...
- GIT URI
https://u3shadow@code.google.com/p/myandorid/
- mongodb 修改操作
$addToSet与$each结合完成批量数组更新 db.text.update({_id:1000},{$addToSet:{books:{$each:["js","d ...