记录编号 59927 评测结果 AAAAAAAAAA
题目名称 [NOI 1999]生日蛋糕 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2013-05-13 21:47:00 内存使用 0.28 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int INF=1000000000;
int n,m;
int ans=INF;
/*
在除掉一个π意义下的圆柱公式:
体积=R^2*H
侧面积=2RH
底面积=R^2
*/
/*
从下到上第x层是从上到下第m+1-x层
l至少是m+1-x,h至少是m+1-x
*/
int minv[99]={0},mins[99]={0};
void DFS(int x,int lr,int lh,int s,int v){
//当前计算第x层,上一层参数是lr,lh,当前面积是s
	if(v>n||(x<=m&&v==n)||s<0||v<0){
		return;
	}
	if(x==m+1){
		if(v==n&&s<ans){
			ans=s;
		}
		return;
	}
	int i,j,nows=0,nowv=0,leftv=n-v-minv[x+1];//i对r,j对h
	if(v+minv[x]>n||s+mins[x]>ans||2*(n-v)/lr+s>=ans) return;
	for(i=lr-1;i>=m+1-x&&i>0;i--){
		if(x==m){
			if((leftv%(i*i)==0)){
				j=leftv/(i*i);
				if(j>=lh) continue;
				nows=s+2*i*j;
				if(x==1) nows+=i*i;
				nowv=v+i*i*j;
				DFS(x+1,i,j,nows,nowv);
			}
			continue;
		}
		for(j=min(leftv/(i*i),lh-1);j>=m+1-x&&j>0;j--){
			nows=s+2*i*j;
			if(x==1) nows+=i*i;
			nowv=v+i*i*j;
			DFS(x+1,i,j,nows,nowv);
		}
	}
}
int main(){
	freopen("cake.in","r",stdin);
	freopen("cake.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i;
	for(i=1;i<=m;i++){
		minv[m+1-i]=minv[m+1-i+1]+i*i*i;
		mins[m+1-i]=mins[m+1-i+1]+2*i*i;
	}
	mins[1]+=m*m;
	DFS(1,n,n,0,0);
	if(ans==INF) printf("0\n");
	else printf("%d\n",ans);
	return 0;
}