记录编号 |
177012 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 1999]生日蛋糕 |
最终得分 |
100 |
用户昵称 |
forever |
是否通过 |
通过 |
代码语言 |
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);
}