以前在OJ上做的题目(9)

    以前在OJ上做的一些题目,总结了一下,写成结题报告,既是给自己的一个总结,也为其他想要参考的ACMer提供一个方便。

POJ 2665 Trees

    开始看到题目“Trees”的时候已经是一个关于树题目,都不敢去做,因为自己这个方面实在是太差劲了,没什么了解 。不过后来看通过率蛮高的,就进去看一下,结果不是虽然也是说树,但此树非彼树,所以,也就不好多说什么了。

Code
<!---->#include  < iostream >
using   namespace  std;
 
int  main()
{
     
long  l;
    
int  m;
    
while (cin >> l >> m)
    {
         
if ( ! &&   ! m)
            
break ;
        
long  total  =  l + 1 ;
        
long  start,end;
        
while (m -- )
        {
            cin
>> start >> end;
            total 
=  total - end + start - 1 ;          
        }   
        cout
<< total << endl;
    }
     
    
return   0 ;    
}


POJ 2681 Anagrammatic Distance

    题目要求对两个字符串进行比较。可以先用两个长度为26的数组分别把第一行和第二行的每个字母出现的次数记录下来,再进行比较。

Code
<!---->#include  < iostream >
#include 
< string >
using   namespace  std;

int  main()
{
     
int  n,k = 0 ;
    scanf(
" %d\n " , & n);
    
char  first[ 50 ], second[ 50 ];
    
while (k < n)
    {
         gets(first);
        gets(second);          
        
int  coutf[ 26 =  { 0 };
        
int  couts[ 26 =  { 0 };
        
for ( int  i = 0 ; i < strlen(first); i ++ )
            coutf[first[i]
- ' a ' ] ++ ;
        
for ( int  i = 0 ; i < strlen(second); i ++ )
            couts[second[i]
- ' a ' ] ++ ;
        
int  distance  =   0 ;
        
for ( int  i = 0 ; i < 26 ; i ++ )
            distance 
+=  abs(coutf[i] - couts[i]);
           
        cout
<< " Case # " <<++ k << " :   " << distance << endl;
    }    
   
  
    
return   0 ;
}


POJ 2707 Copier Reduction

    在每一个可能缩小成的比例下,使前一个能够被后一个装下存在两个可能,即直接可以被装下,或者旋转90度后被装下。这样的话,就可以从比例为100%开始,将比例逐渐减小,判断两种情况中是否至少有一种能够成立。找到后,退出。

Code
<!---->#include  < iostream >
using   namespace  std;

int  main()
{
     
long  a,b,c,d;
    
while (cin >> a >> b >> c >> d)
    {
         
if ( ! &&   ! &&   ! &&   ! d)
            
break ;
        
int  percentage;
        
for (percentage  =   100 ; percentage >= 1 ; percentage -- )
             
if (((a * percentage <= c * 100 ) && (b * percentage <= d * 100 ))  ||
               ((a
* percentage <= d * 100 ) && (b * percentage <= c * 100 )))     
            {
                cout
<< percentage << " % " << endl;
                
break ;                                                        
            }                             
    }    
 
    
return   0 ;
}


POJ 2739 Sum of Consecutive Prime Numbers

    如果没有记错的话,之前应该也有个题目跟这个差不多。就是要将一个整数分解成一系列连续的素数之和,求有多 少种分法。可以考虑设立两个变量,第一个变量指向第一个素数,第二个变量在这个基础上,指向新的素数,然后求和,直到其和大于或等于给定的数。之后将前一 变量指向下一素数,继续循环。

Code
<!----> #include  < iostream >
#include 
< cmath >
using   namespace  std;

int *  getPrime( int   & pnum,  int  n)
{
    
int   * prime  =   new   int [n];
    prime[
0 =   2 ;
    pnum 
=   1 ;
     
for ( int  i = 3 ; i <= n; i += 2 )
     {
        
bool  tag  =   true ;
         
for ( int  j = 2 ; j <= sqrt( double (i)); j ++ )
             
if (i % ==   0 )
             {
                 tag 
=   false ;
                 
break ;
            }
        
if (tag)
            prime[pnum
++ =  i;
    }
    
return  prime;
}

int  main()
{
     
int  n;
    
while (cin >> n)
    {
         
if ( ! n)
            
break ;
        
int  pnumber  =   0 , out = 0 ;
        
int   * prime  =  getPrime(pnumber,n);
        
for ( int  i = 0 ; i < pnumber;& <noscript type="text/javascript" src="/editor/tiny_mce/plugins/insertCode/langs/zh.js"></noscript> <noscript type="text/javascript" src="/editor/tiny_mce/plugins/uploadImage/langs/zh.js"></noscript> <noscript type="text/javascript" src="/editor/tiny_mce/themes/advanced/langs/zh.js"></noscript> nbsp;i ++ )
        {
            
int  j = i;
             
int  sum  =  prime[j ++ ];
            
while (sum  <=  n)
            {
                 
if (sum  ==  n)
                 {
                        
out ++ ;
                    
break ;
                }
                sum
+= prime[j ++ ];
            }
// end of while        
        } // end of for            
        cout << out << endl;
    }
// end of out-while
   
    
return   0 ;   
}


POJ 2840 Big Clock

    一个时间的题目,应该说还蛮简单的,只要对题目给出的数据稍微处理一下就好了,如果没思路的话,不妨把题目再看一下,或者画个图。

Code
<!---->#include  < stdio.h >
int  main()
{
     
int  n,s,i;
    
char  t[ 6 ];
    scanf(
" %d " , & n);
    
while (n -- )
    {
         scanf(
" %s " ,t);
         i
= 0 ,s = 0 ;
        
while (t[i]  !=   ' : ' )
              i
++ ;
        
if (i == 1 )
        {   
            s
+= (t[ 0 ] - ' 0 ' );
            
if (t[ 2 ] != ' 0 '   ||  t[ 3 ] != ' 0 ' )   
                 s
=- 1 ;
        }
        
else
        {
              s
= (t[ 0 ] - ' 0 ' ) * 10 + (t[ 1 ] - ' 0 ' );
              
if (t[ 3 ] != ' 0 '   ||  t[ 4 ] != ' 0 ' )   
                s
=- 1 ;
        }
        
if (s ==- 1 )   
            printf(
" 0\n " );
        
else {       
            
if (s == 12 )   
                printf(
" 24\n " );
            
else        
                printf(
" %d\n " ,(s + 12 ) % 24 );
        }
    }
    
return   0 ;
}


POJ 2853 Sequence Sum Possibilities

    印象中之前有一个题是要求把一个正整数化成一系列的素数之和,而这个是直接化成一系列连续的正整数之和,其中省去对素数的判断那一步,其他的基本一样。这 是常规思路,如果我没有记错的话,这样做是会超时的,因为一开始我也是这样想的,后来参考别人的意见才改成了现在的这样。

Code
<!---->#include  < iostream >
using   namespace  std;

int  main()
{
     
int  n;
    cin
>> n;
    
while (n -- )
    {
        
int  pronum;
        
long  number, result = 0 ;
        cin
>> pronum >> number;
       
        
for ( long  i = 2 ; number  >=  (i + 1 ) * i / 2 ; i ++ )
             
if ((number - (i - 1 ) * i / 2 ) % i == 0 )
                result
++ ;
        cout
<< pronum << "   " << result << endl;
    }    
   
    
return   0 ;
}


POJ 2864 Pascal Library

    记不清题目是什么意思了,大概看了一下,也没有看明白,看来我的英语水平还很有发展空间啊,呵呵~~~不过照着代码看,应该还是大概能够看明白是在做什么。

Code
<!---->#include  < iostream >
using   namespace  std;

int  main()
{
     
int  n,d;
    
while (cin >> n >> d)
    {
         
if ( ! &&   ! d)
             
break ;
         
int  a,t = 0 ,tag = 0 ;
        
for ( int  i = 1 ;i <= n;i ++ )
        {    
            
for ( int  j = 1 ;j <= d;j ++ )
            {    
                cin
>> a;     
                
if (a  ==   1 )
                    t
++ ;    
            }
            
if (t == d)
                tag
++ ;    
            t
= 0 ;        
        }
        (tag
== 0 ) ? cout << " no " << endl:cout << " yes " << endl;
    }     
 
    
return   0 ;
}
 


POJ 2871 A Simple Question of Chemistry

Code
<!---->#include  < iostream >
using   namespace  std;

int  main()
{
    
float  p,r;
    cin
>> p;
    
while (cin >> r)
    {
         
if (r  ==   999 )
         {   
            cout
<< " End of Output " ;    
            
break ;
        }
        p
= r - p;
        printf(
" %.2f\n " ,p);
        p
= r;             
    }
  
    
return   0 ;   
}


POJ 2876 Cantoring Along

    将一串很长的'-'字符进行第三分之二部分去掉的操作,直到最后从左到右连续的三个'-'都是第二个变成空格。看完题目之后,觉得这是一个典型的递归问 题,所以用的也是递归的方法,不过自己在三分之一和三分二的这两个地方没有控制好,导致程序有时莫名地崩溃,后面,仔仔细细地从前到后检查了一次才发现了 问题的所在。

Code
<!---->#include  < iostream >
#include 
< cmath >
using   namespace  std;

void  replace( bool   * array,  long  left,  long  right)
{
     
if ((right - left)  ==   3 )
         array[left
+ 1 =   true ;
    
else
    {
         
for ( long  i = right / 3 + left / 3 * 2 ; i < right / 3 * 2 + left / 3 ; i ++ )
            array[i] 
=   true ;
        replace(array,left,right
/ 3 + left / 3 * 2 );
        replace(array,right
/ 3 * 2 + left / 3 ,right);     
    }                 
}

int  main()
{
    
int  n;
    
while (cin >> n)
    {
        
long  num  =  ( long )pow( 3.0f ,n);
        
bool   * array  =   new   bool [num];
        
for ( long  i = 0 ; i < num; i ++ )
            array[i] 
=   false ;
            
        
if ( ! n)
            printf(
" -\n " );
        
else
        {
            replace(array,
0 ,num);     
    
            
for ( long  i = 0 ; i < num; i ++ )
             {
                 
if (array[i])
                    printf(
"   " );
                
else
                    printf(
" - " );         
            }
            printf(
" \n " );
        }
    }
   
    
return   0 ;
}


POJ 3006 Dirichlet's Theorem on Arithmetic Progressions

Code
<!---->#include  < iostream >
#include 
< cmath >
using   namespace  std;

bool  isPrime( long  p)
{
    
for ( long  i = 2 ; i <= sqrt( double (p)); i ++ )
        
if (p % ==   0 )
            
return   false ;
    
return   true ;
}

int  main()
{
    
int  a,d,n;
    
while (cin >> a >> d >> n)
    {
        
if ( ! &&   ! &&   ! n)
            
break ;
        
int  num  =   0 ;
        
if (a  ==   1 )
            num 
=   color:
分享到:
评论

你可能感兴趣的:(JavaScript,C++,c,J#,pascal)