| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
请高手帮忙看一下,跪求(题号1190-----生日蛋糕)总是wrong answer,我用题目里的例子试了没问题
/*********************************************************************/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(int argc,char** argv[])
{
int n=100;
scanf("%d",&n);
int m=2;
scanf("%d",&m);
int maxr=(int)sqrt(n/m); //最下那层最小是m,r最大不会超过这个
int maxh=n/m/m; //同上
long mulr=1;
long mulh=1;
for(int i=0;i<m;i++){
mulr=mulr*(maxr-i);
mulh=mulh*(maxh-i);}
long i_m=1;
for(i=0;i<m;i++)
i_m=i_m*(i+1);
mulr=mulr/i_m; //mulr是1到maxr取m个数的种数
mulh=mulh/i_m; //同上
int *rlist=new int[m];//存放各层的R
int *hlist=new int[m];//同上
for(i=0;i<m-1;i++)
{
rlist[m-1-i]=maxr-i;//rlist[m]是最底那层
hlist[m-1-i]=maxh-i;//同上
}
rlist[0]=maxr-m+2; //因为从下面的可以看出,一开始的时候就要--,所以把最小那个先++
hlist[0]=maxh-m+2;// 同上
long q=0; //存放最终结果
bool is=true; //记录是否是找到的体积为n 的第一个s值,用处不大,但有用
for(i=0; i<mulr;i++){//rlist[]一共mulr种,与下面的hlist[]相乘,是所有r和h的种数,当然不保证体积为n
rlist[0]--; //下面的代码是从小到大依次尝试每个r,因为每层的r的关系有限制,所以要做必要的调整
if(rlist[0]<1){
int k;
for(k=0;k<m;k++)
if(rlist[k]>k+1)break;
if(k>=m)break;
rlist[k]--;
for(;k>0;k--){
rlist[k-1]=rlist[k]-1;
}
}
for(int j=0;j<mulh;j++){ //在每个r中尝试每个h,同上,需要调整
hlist[0]--;
if(hlist[0]<1){
int l;
for(l=0;l<m;l++)
if(hlist[l]>l+1)break;
if(l>=m)break;
hlist[l]--;
for(;l>0;l--){
hlist[l-1]=hlist[l]-1;
}
}
long sum=0; //看体积是否为n
for(int t=0;t<m;t++){
sum=rlist[t]*rlist[t]*hlist[t]+sum;}
if(sum==n){ //如果是的话
long qe=rlist[m-1]*rlist[m-1];
for(int t=0;t<m;t++)
qe=rlist[t]*hlist[t]*2+qe;
if(is){q=qe;is=false;
}
else if(qe<q)q=qe;
}
}
for(j=0;j<m-1;j++)
hlist[m-1-j]=maxh-j;
hlist[0]=maxh-m+2;
}
printf("%d\n",q);
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator