A題:找出字符串中是否出現了26個英文字母,不區分大小寫
#include#include #include using namespace std ; char str[200] ; int a[30] , b[30] ; int main() { int n , i ; scanf("%d", &n) ; scanf("%s", str) ; memset(a,0,sizeof(a)) ; memset(b,0,sizeof(b)) ; for(i = 0 ; i < n ; i++) { if( str[i] >= 'a' && str[i] <= 'z' ) a[ str[i]-'a' ] = 1 ; if( str[i] >= 'A' && str[i] <= 'Z' ) b[ str[i]-'A' ] = 1 ; } for(i = 0 ; i < 26 ; i++) if( a[i] == 0 && b[i] == 0 ) break ; if( i < 26 ) printf("NO\n") ; else printf("YES\n") ; return 0 ; }
B題:給出兩種操作方式,一種是乘2,一種是減一,給出初始數n,問可以可以達到m,可以輸出步數,否則輸出任意一個數。
進行廣搜,看是否可以找到那個數。
#include#include #include #include using namespace std ; struct node{ int a , t ; }p , q ; queue que ; int a[30000] ; int main() { int n , m , num , flag ; while( scanf("%d %d", &n, &m) != EOF ) { memset(a,0,sizeof(a)) ; flag = 0 ; num = 0 ; p.a = n ; p.t = 0 ; while( !que.empty() ) que.pop() ; que.push(p) ; while( !que.empty() ) { p = que.front() ; que.pop() ; if( p.a == m ) { flag = 1 ; break ; } q = p ; q.a-- ; q.t++ ; if( q.a >= 0 && a[ q.a ] == 0 ) { a[ q.a ] = 1 ; que.push(q) ; } q = p ; q.a *= 2 ; q.t++ ; if( q.a >= 0 && q.a <= 20000 && a[ q.a ] == 0 ) { a[ q.a ] = 1 ; que.push(q) ; } } if( flag == 1 ) printf("%d\n", p.t) ; else printf("0") ; } return 0 ; }
C題:數學題,按照公式的話,兩個串從任意一個位置開始匹配都會統計到,那麼找出給定字符串的出現次數最多的字符有幾個,結果也就是它的n次方。
#include#include #include using namespace std ; #define MOD (int)(1e9+7) #define LL __int64 char str[200000] ; int num[10] ; LL pow(LL a,LL b) { if( b == 1 ) return a ; LL c = pow(a,b/2) ; c = c*c % MOD ; if( b % 2 ) c = c * a % MOD ; return c; } int main() { int i , n ; memset(num,0,sizeof(num)) ; scanf("%d", &n) ; scanf("%s", str) ; for(i = 0 ; i < n ; i++) { if( str[i] == 'A' ) num[0]++ ; if( str[i] == 'C' ) num[1]++ ; if( str[i] == 'G' ) num[2]++ ; if( str[i] == 'T' ) num[3]++ ; } int max1 = 0 , k = 0 ; for(i = 0 ; i < 4 ; i++) max1 = max( max1,num[i] ) ; for(i = 0 ; i < 4 ; i++) if( num[i] == max1 ) k++ ; printf("%I64d\n", pow(k,n) ) ; return 0 ; }