典型的静态搜索,可以用Hash做,但是近来练排序,就用排序做吧! 顺便说一下,离线搜索,可以用Hash,也可以用排序 深度优先搜索中,如果后面的搜索与前面的搜索不相关,则可以将两者分开来搜索。 #include <cstdio> #include <algorithm> using namespace std; const int MAX = 20000; int cube[110]; int A[MAX]; int binarysearchlower( int left , int right , int key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( A[middle] < key ) left = middle + 1 ; else right = middle - 1 ; } if( A[left] == key ) return left; else return -1; } int binarysearchupper( int left , int right , int key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( A[ middle ] <= key ) left = middle + 1 ; else right = middle - 1; } if( A[ right ] == key ) return right; else return -1; } int main() { int n1,n2,n3,n4,n5; int n,result,k; scanf("%d%d%d%d%d",&n1,&n2,&n3,&n4,&n5); k = -50; for( int i = 0 ; i < 100 ; ++i ) { if( k == 0 ) ++k; cube[i] = k * k * k; ++k; } n = 0 ; for( int i = 0 ; i < 100 ; ++i ) for( int j = 0 ; j < 100 ; ++j ) { A[n++] = cube[i] * n1 + cube[j] *n2; } sort( &A[0] , &A[n] ); result = 0 ; for( int i = 0 ; i < 100 ; ++i ) for( int j = 0 ; j < 100 ; ++j ) for( int k = 0 ; k < 100 ; ++k ) { int mid = cube[i] * n3 + cube[j] * n4 + cube[k] * n5; mid = -mid; int left = binarysearchlower( 0 , n - 1 , mid ); int right = binarysearchupper( 0 , n - 1 , mid ); if( left != -1 ) { result += right - left + 1 ; } } printf("%d/n",result); }