hdu 1399 Starship Hakodate-maru(暴力捜索)
9148 ワード
タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1399
i*i*i+j*(j+1)*(j+2)/6の形式を満たし、n以下の最大値を見つける.
2つ目は良いと思うコードです.
View Code
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
",max);
23 }
24 }
2つ目は良いと思うコードです.
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
",max);
30 }
31 return 0;
32 }
View Code