首页 > 其他 > 详细

Luogu P1731 生日蛋糕(dfs剪枝)

时间:2019-02-03 16:26:41      阅读:220      评论:0      收藏:0      [点我收藏+]
#include<cstdio>
#include<cmath>
using namespace std;

int n,m,r[55],h[55],minn=0x7ffffff;

inline int min(int x,int y){return x>y?y:x;}

inline void dfs(int now,int rest,int s,int z){
    if(rest==0&&now==m+1){
        s+=r[1]*r[1];
        minn=min(minn,s);
        return;
    }
    if(rest==0||now==m+1)return;
    if(s+r[1]*r[1]>minn)return;//
    if(r[now-1]*r[now-1]*h[now-1]*z<rest)return;//
    for(int i=r[now-1]-1;i>=z;i--){
        for(int j=h[now-1]-1;j>=z;j--){
            if(i*i*j<=rest){
                r[now]=i;
                h[now]=j;
                dfs(now+1,rest-i*i*j,s+(2*i*j),z-1);
                r[now]=0;
                h[now]=0;
            }
        }
    }
}

int main(){
    /*
  
for r[1] h[1]: v=r*r*h v<n r>=m h>=m .`. r*r>=m*m h=v/(r*r) .`. h max=vmax/(r*r)min=n/(m*m) r*r=v/h .`. r*r max=vmax/hmin=n/m
  */ scanf("%d%d",&n,&m); r[0]=int(sqrt(n/m)); h[0]=n/(m*m); dfs(1,n,0,m); if(minn==0x7ffffff)printf("%d\n",0); else printf("%d\n",minn); }

代码参考洛谷一位巨佬的题解,不过ta有几个地方很莫名其妙O_O ,于是我改动了一些东西。例如,r[0]与h[0]的值应该取这个呀,手推的过程在上面。

在此orz那位巨佬,ta的题解是洛谷上这一题极少见的不带初始化的题解,通俗易懂%%%

Luogu P1731 生日蛋糕(dfs剪枝)

原文:https://www.cnblogs.com/Y15BeTa/p/10350525.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!