hdu 1399 Starship Hakodate-maru (暴力搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1399

题目大意:找到满足i*i*i+j*(j+1)*(j+2)/6形式且小于等于n的最大值。

 1 #include<iostream>

 2 #include<cstdio>

 3 

 4 using namespace std;

 5 

 6 int main()

 7 {

 8     int n;

 9     while(scanf("%d",&n),n)

10     {

11         int j,k,max=0;

12         for(j=0; j*(j+1)*(j+1)/6<=n; j++)

13         {

14             for(k=0; k*k*k<=n; k++)

15             {

16                 if(k*k*k+j*(j+1)*(j+2)/6>n)

17                     break;

18             }

19             if(max<(k-1)*(k-1)*(k-1)+j*(j+1)*(j+2)/6&&(k-1)*(k-1)*(k-1)+j*(j+1)*(j+2)/6<=n)

20                 max=(k-1)*(k-1)*(k-1)+j*(j+1)*(j+2)/6;

21         }

22         printf("%d\n",max);

23     }

24 }

还有第二种认为不错的代码。

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cmath>

 4 

 5 using namespace std;

 6 

 7 int main()

 8 {

 9     int n,t,max,res;

10     while(scanf("%d",&n)!=EOF)

11     {

12         if(n==0) break;

13         max=0;

14         for(int i=0; i*(i+1)*(i+2)/6<=n; i++)

15         {

16             res=0;

17             t=n-i*(i+1)*(i+2)/6;

18             for(int j=(int)pow(n,1.0/3); j>=0; j--)

19             {

20                 if(j*j*j<=t)

21                 {

22                     res=j*j*j;

23                     break;

24                 }

25             }

26             if(res+i*(i+1)*(i+2)/6>max)

27                 max=res+i*(i+1)*(i+2)/6;

28         }

29         printf("%d\n",max);

30     }

31     return 0;

32 }
View Code

 

你可能感兴趣的:(Date)