1 solutions
-
-1
臭蛋糕
优化:
1.如果当前表面积大于等于最小答案,直接return。
2.如果当前体积能达到的最大体积都达不到题目要求的n(达到最大体积,也就是剩余所有蛋糕的r和h都是比这一层的r和h小一),直接return。
3.如果当前体积比n大,直接return。
4.如果当前表面积能达到的最小表面积(达到最小表面积,也就是剩余所有蛋糕的r都是1且h为1)都比最小答案大,直接return。
5.r可能的最大值为,h为代码
#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