以前在OJ上做的一些题目,总结了一下,写成结题报告,既是给自己的一个总结,也为其他想要参考的ACMer提供一个方便。
POJ 2665 Trees
开始看到题目“Trees”的时候已经是一个关于树题目,都不敢去做,因为自己这个方面实在是太差劲了,没什么了解 。不过后来看通过率蛮高的,就进去看一下,结果不是虽然也是说树,但此树非彼树,所以,也就不好多说什么了。
Code
<!---->#include < iostream >
using namespace std;
int main()
{
long l;
int m;
while (cin >> l >> m)
{
if ( ! l && ! 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 ( ! a && ! b && ! c && ! 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 % j == 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 ( ! n && ! 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 % i == 0 )
return false ;
return true ;
}
int main()
{
int a,d,n;
while (cin >> a >> d >> n)
{
if ( ! a && ! d && ! n)
break ;
int num = 0 ;
if (a == 1 )
num = color:
分享到:
评论