1 solutions

  • -1
    @ 2025-2-21 21:00:10

    臭蛋糕

    优化:
    1.如果当前表面积大于等于最小答案,直接return
    2.如果当前体积能达到的最大体积都达不到题目要求的n(达到最大体积,也就是剩余所有蛋糕的r和h都是比这一层的r和h小一),直接return
    3.如果当前体积比n大,直接return
    4.如果当前表面积能达到的最小表面积(达到最小表面积,也就是剩余所有蛋糕的r都是1且h为1)都比最小答案大,直接return
    5.r可能的最大值为2×104328\sqrt[3]{2 \times 10^4} \approx 28,h为nr2\frac{n}{r^2}

    代码

    #include<bits/stdc++.h>
    using namespace std;
    //v:已经制作的蛋糕体积
    //r:上一层蛋糕的半径
    //h:上一层蛋糕的高
    //f:已经制作的蛋糕层数
    //s:已经使用的奶油面积
    
    int n,m,sum=20000001;
    void dfs(int v,int r,int h,int f,int s){
    	if(s>=sum)return;
    	
    	//如果从当前的体积开始用最大体积方案也无法达到n,直接退出
    	if((m-f)*r*r*h+v<n)return;
    	
    	if(f==m&&v==n){//已经制作的蛋糕层数为需要的层数且大小为需要的大小
    		sum=min(sum,s);
    		return;
    	}
    	if(v>=n)return;
    	//由于顶层r和h最小为1
    	//所以第i层蛋糕的r和h最小为m-i+1	(m-f)
    	if((m-f)*2+s>sum)return;//k*(2*1)
    	if(f==0){//刚开始
    		for(int i=r;i>=m;i--){
    			for(int j=m;j<=n/i/i;j++){
    				dfs(i*i*j,i,j,1,i*i+2*i*j);
    			}
    		}
    		return;
    	}
    	for(int i=r-1;i>=m-f;i--){
    		for(int j=m-f;j<h;j++){
    			if(v+i*i*j<=n){
    				dfs(v+i*i*j,i,j,f+1,s+2*i*j);
    			}
    		}
    	}
    }
    
    int main(){
    	cin>>n>>m;
    	dfs(0,28,28,0,0);
    	if(sum==20000001){
    		cout<<0;
    		return 0;
    	}
    	cout<<sum;
    }
    
    • 1

    Information

    ID
    346
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    9
    Tags
    # Submissions
    218
    Accepted
    9
    Uploaded By