(2013-06-21 13:51:56)
SOJ1739:http://cstest.scu.edu.cn/soj/problem.action?id=1739
切一个圆柱体的蛋糕,只能垂直或平行底面来切。求切了n刀,最多可以切成多少块。
这道题是一道动态规划题。我们将垂直底面切蛋糕称为竖切,平行底面切蛋糕称为横切。如果已有竖切x刀,横切y刀,那么当前蛋糕的最多块数为[x(x+1)/2+1](y+1)。下一刀如果横切则最多可将蛋糕切成[x(x+1)/2+1](y+2)块;如果竖切则最多切成[(x+1)(x+2)/2+1](y+1)块。
令[x(x+1)/2+1](y+2)-[(x+1)(x+2)/2+1](y+1)>0,得
x^2-x>2y(x+1).也即是当x^2-x>2y(x+1)时,下一刀应横切;反之则竖切。
我们知道当切两刀时,一个横切一个竖切,也即x=1,y=1.下面开始递推。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<math.h>
using namespace std;
long long result[3000005];
void f()
{
int i;
result[0]=1;
result[1]=2;
result[2]=4;
long long x=1;
long long y=1;
for(i=3;i<=3000000;i++)
{
if( x*x-x>2*y*(x+1) )
{
result[i]=( (x*x+x)/2+1 )*( y+2 );
y++;
}
else
{
result[i]=( (x+1)*(x+2)/2+1 )*( y+1 );
x++;
}
}
}
int main()
{
f();
int N,n;
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
printf("%lld\n",result[n]);
}
return 0;
}