众数问题
# include <bits/stdc++.h>
using namespace std;
int mode, num= 0 ;
void modefind ( int l, int r, int a[ ] )
{
int m= 1 , i, j;
int mid= ( l+ r) / 2 ;
for ( i= mid- 1 ; i>= l; i-- )
if ( a[ mid] == a[ i] )
m++ ;
else
break ;
for ( j= mid+ 1 ; j<= r; j++ )
if ( a[ mid] == a[ j] )
m++ ;
else
break ;
if ( m> num)
{
mode= a[ mid] ;
num= m;
}
if ( m== num&& a[ mid] < mode)
mode= a[ mid] ;
if ( r- j> m)
modefind ( j, r, a) ;
if ( i- l> m)
modefind ( l, i, a) ;
}
int main ( )
{
ios:: sync_with_stdio ( false ) ;
int n;
cin>> n;
int a[ n+ 9 ] ;
for ( int i= 0 ; i< n; i++ )
cin>> a[ i] ;
sort ( a, a+ n) ;
modefind ( 0 , n- 1 , a) ;
cout<< mode<< endl<< num<< endl;
return 0 ;
}
整数因子分解问题
# include <bits/stdc++.h>
using namespace std;
int a[ 500000 ] ;
long long int f ( int n)
{
long long int result = 1 ;
if ( n< 500000 && a[ n] != 0 )
return a[ n] ;
for ( int i= 2 ; i<= sqrt ( n) ; i++ )
{
if ( n% i== 0 )
{
if ( i* i== n)
result += f ( i) ;
else
{
result += f ( i) + f ( n/ i) ;
}
}
}
if ( n< 500000 )
a[ n] = result;
return result;
}
int main ( )
{
int n;
memset ( a, 0 , sizeof ( a) ) ;
scanf ( "%d" , & n) ;
printf ( "%lld\n" , f ( n) ) ;
return 0 ;
}
最大子段和之分支递归法
# include <bits/stdc++.h>
using namespace std;
int a[ 50000 ] = { 0 } ;
int sum= 0 , flag= 0 ;
int f ( int l, int r)
{
flag++ ;
if ( l== r)
if ( a[ l] > 0 )
sum= a[ l] ;
else
sum= 0 ;
else
{
int mid= ( l+ r) / 2 ;
int l_segment= f ( l, mid) ;
int r_segment= f ( mid+ 1 , r) ;
int s= 0 ;
for ( int i= l; i<= r; i++ )
{
if ( a[ i] + s> 0 )
sum= max ( sum, s= a[ i] + s) ;
else
s= 0 ;
}
sum= max ( sum, l_segment) ;
sum= max ( sum, r_segment) ;
}
return sum;
}
int main ( )
{
ios:: sync_with_stdio ( false ) ;
int n, segment;
cin>> n;
for ( int i= 0 ; i< n; i++ )
cin>> a[ i] ;
segment= f ( 0 , n- 1 ) ;
cout<< segment<< " " << flag<< endl;
return 0 ;
}
骨牌铺方格
# include <bits/stdc++.h>
using namespace std;
int main ( )
{
ios:: sync_with_stdio ( false ) ;
int n;
int m;
long long int a[ 100 ] ;
a[ 1 ] = 1 ;
a[ 2 ] = 2 ;
for ( n= 3 ; n<= 50 ; n++ )
{
a[ n] = a[ n- 1 ] + a[ n- 2 ] ;
}
while ( scanf ( "%d" , & m) != EOF )
{
printf ( "%lld\n" , a[ m] ) ;
}
return 0 ;
}