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

A题:找出字符串中是否出现了26个英文字母,不区分大小写

#include <cstdio>
#include <cstring>
#include <algorithm>
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 <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std ;
struct node{
    int a , t ;
}p , q ;
queue <node> 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 <cstdio>
#include <cstring>
#include <algorithm>
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 ;
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值