Codeforces Round #295 (Div. 2) A+B+C

2015-07-20 17:13:28 ? 作者: ? 浏览: 3

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 ; } 
    
   
  


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: