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 |
大家来看看这个,太有意思啦,直接从32ms到0ms#include<stdio.h> #define in(a,b) (a<b?a:b) int n,m; int minv[21],mins[21]; int bests; void dfs(int v,int s,int level,int r,int h) { if(level==0) { if(v==n && s<bests) bests=s; return ; } if(v+minv[level-1]>n || s+mins[level-1]>bests || 2*(n-v)/r+s>=bests) //如果把中括号内的level-1都换成level就是32ms return ; int i,j,hh; for(i=r-1;i>=level;i--) { if(level==m) s=i*i; hh=in((n-v-minv[level-1])/(i*i),h-1); for(j=hh;j>=level;j--) dfs(v+i*i*j,s+2*i*j,level-1,i,j); } } int main() { int i; minv[0]=0; mins[0]=0; for(i=1;i<=20;i++) { minv[i]=minv[i-1]+i*i*i; mins[i]=mins[i-1]+2*i*i; } while(scanf("%d%d",&n,&m)==2) { bests=0x7fffffff; dfs(0,0,m,n+1,n+1); if(bests==0x7fffffff) printf("0\n"); else printf("%d\n",bests); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator