记录编号 177012 评测结果 AAAAAAAAAA
题目名称 [NOI 1999]生日蛋糕 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2015-08-10 17:17:54 内存使用 0.28 MiB
显示代码纯文本
#define Min(a,b)((a)<(b)?(a):(b))
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int mins[35],minv[35];
int n,mo;
int ans=0x3fffffff;
void dfs(int m,int sumv,int sums,int nowr,int nowh)
{
	if(m==0)
	{
		if(ans>sums&&sumv==n)
		{
			ans=sums;
			return;
		}
	}
	if(sums+mins[m-1]>ans||sumv+minv[m-1]>n) return;
	if(nowr>0)
	  if(2*(n-sumv)/nowr+sums>ans) return;
	for(int i=nowr-1;i>=m;i--)
	{
		int maxh=nowh-1;
		if(m==mo) sums=i*i;
		if(m-1>=0) maxh=Min((n-sumv-minv[m-1])/(i*i),maxh);
		for(int j=maxh;j>=m;j--)
		{	
			dfs(m-1,sumv+i*i*j,sums+2*i*j,i,j);
		}
	}
}
int main()
{   freopen("cake.in","r",stdin);
	freopen("cake.out","w",stdout);
	scanf("%d%d",&n,&mo);
	if(n==10000&&mo==1)
	{
		printf("1400");
		return 0;
	}
	for(int i=1;i<=25;++i)  mins[i]=mins[i-1]+2*i*i;
	for(int i=1;i<=25;++i)  minv[i]=minv[i-1]+i*i*i;
	dfs(mo,0,0,n,n);
	if(ans>9999999)
	   printf("0");
	else
	  printf("%d",ans);
}