zoukankan      html  css  js  c++  java
  • [NOI1999]生日蛋糕

    洛咕

    POJ

    要制作一个体积为(Nπ)(M)层的蛋糕,要求从下往上每一层的半径和高度都是递减的,求一种制作方案使得蛋糕外表面(最下一层的下底面除外)的面积Q最小.令(Q=Sπ),输出最小的S.

    反正每个公式里面都有(π),我们干脆把它约掉就好了.然后从下往上开始搜索第x层的(r[x])(h[x]).

    剪枝一:每一层(r[x])上界是(r[x-1]-1)(满足递减),下界是剩余层数(y=m+1-x)(保证第m层的r最小能够取到1),(h[x])上下界同理可得.

    剪枝二:从大到小枚举(r[x])(h[x]),保证状态数能够减少.

    剪枝三:如果当前表面积(snow)+底面积(r[1]*r[1])大于等于当前的最小ans,直接return掉.

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #define ll long long
    using namespace std;
    inline int read(){
        int x=0,o=1;char ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')o=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    const int N=20;
    int n,m,ans,r[N],h[N];
    inline void dfs(int x,int y,int vnow,int snow){
    	if(snow+r[1]*r[1]>=ans)return;
        if(vnow==0&&x==m+1){
    		snow+=r[1]*r[1];
    		if(snow<ans)ans=snow;
    		return;
        }
    	if(x==m+1)return;
    	if(vnow-r[x-1]*r[x-1]*h[x-1]*y>0)return;//无法凑出体积n的蛋糕了
        for(int i=r[x-1]-1;i>=y;--i)
    		for(int j=h[x-1]-1;j>=y;--j){
                if(vnow-i*i*j>=0){
    				r[x]=i;h[x]=j;
    				dfs(x+1,y-1,vnow-i*i*j,snow+2*i*j);
    				h[x]=0;r[x]=0;
    			}
    		}
    }
    int main(){
        n=read();m=read();
        r[0]=(int)sqrt(n);h[0]=(int)sqrt(n);
        ans=1e9;dfs(1,m,n,0);
        if(ans==1e9)puts("0");
    	else printf("%d
    ",ans);
        return 0;
    }
    
    
  • 相关阅读:
    vue——图片懒加载v-lazy
    vue——利用intersectionOberver实现全局appear/disappear事件
    WXS-----学会使用WXS
    使用内联样式
    样式引入
    小程序开发框架----WXSS
    引入内部外部模板
    Selenium元素定位的几种方式
    Response Assertion(响应断言)
    参数化CSV Data Set config元件
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11386073.html
Copyright © 2011-2022 走看看