hihocoder #1052 : 基因工程

这道题根据网上的一些代码和别人的讲解就是分为两种情况第一种:k*2<=len 直接比较, 第二种:就是会出现

有重叠部分,我们可以从结果入手, 最后一定是形成若干个长度为(len - k)的循环节(至于为什么网上看http://www.cnblogs.com/boring09/p/4373492.html)从每一个循环节中一个个比较,找出最大的字符出现数,最后输出的答案里加上其余的计数, 由于最大计数不计入ans,所以减去。


#include <iostream>

#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <sstream>
#include <cctype>
#include <set>
#include <string>
#include <stack>
#include <vector>
using namespace std;
const int N = 1005;
const int inf = 0x3f3f3f3f;
int main()
{
    int t, k, len, ans;
    char str[N];
    scanf("%d", &t);
    while(t--)
    {
        scanf("%s %d", str, &k);
        len = strlen(str);
        ans = 0;
        if(k * 2 <= len)
        {
            for(int i = 0, j = len - k ; j < len; i++ , j++)
                ans += str[i]!=str[j]?1:0;
        }
        else
        {
            for(int i = 0; i < len - k ; i++)
            {
                int Count[4] = {0};
                for(int j  = i; j<len; j+=len-k)
                {
                    if(str[j]=='A')
                        Count[0]++;
                    else if(str[j]=='T')
                        Count[1]++;
                    else if(str[j]=='C')
                        Count[2]++;
                    else if(str[j]=='G')
                        Count[3]++;
                }
                int Max = 0;
                for(int j = 0; j<4;j++)
                {
                    Max = max(Max, Count[j]);
                    ans+=Count[j];
                }
                ans -= Max;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值