hihoCoder 1052 基因工程 最详细的解题报告

题目来源:基因工程

解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum。

假设基因序列为 ATACGTCT (即M=8),K=6;interval=M-K=2;

0  1  2  3  4  5  6  7

sq1    A  T  A C  G  T  C  T

sq2    A  C G T   C  T

从上图可以看出,标有相同彩色的字符相同,sq1的下标为0的字符与sq2的下标为0的字符相同,即 sq1[0]==sq1[2],由此可以得出sq1[i]==sq1[i+interval],其中0<=i<=interval,因此此题可以转化为求要想使字符 sq1[i],sq1[i+interval],sq1[i+interval*2],... 全部变成相同字符,需要改变多少次。解决这个问题就很简单了,只需要分别统计所有字符出现的次数,然后用总数total减去字符出现最多的次数max,即temp=total-max;最后将所有的temp求和。

具体算法(Java版,直接AC)

 1 import java.util.Scanner;
 2
 3 public class Main {
 4
 5     public static void main(String[] args) {
 6         Scanner scanner = new Scanner(System.in);
 7         int T = scanner.nextInt();
 8         while (T > 0) {
 9             String gene = scanner.next();
10             int K = scanner.nextInt();
11             int interval = gene.length() - K;
12             int sum = 0;
13             for (int i = 0; i < interval; i++) {
14                 int[] count = new int[4];//用来统计出现的次数
15                 for (int j = i; j < gene.length(); j += interval) {
16                     if (gene.charAt(j) == ‘A‘) {
17                         count[0]++;
18                     } else if (gene.charAt(j) == ‘T‘) {
19                         count[1]++;
20                     } else if (gene.charAt(j) == ‘C‘) {
21                         count[2]++;
22                     } else if (gene.charAt(j) == ‘G‘) {
23                         count[3]++;
24                     }
25                 }
26                 int total = 0, max = 0;
27                 for (int j = 0; j < 4; j++) {
28                     total += count[j];
29                     max = max > count[j] ? max : count[j];
30                 }
31                 sum += total - max;
32             }
33             System.out.println(sum);
34             T--;
35         }
36     }
37 }
时间: 2024-12-20 19:04:25

hihoCoder 1052 基因工程 最详细的解题报告的相关文章

hihoCoder 1037 数字三角形 最详细的解题报告

题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public class Main { public static int[][] rewards; public static int[][] best; public static void main(String[] args) { Scanner scanner = new Scanner(System

hihoCoder 1051 补提交卡 最详细的解题报告

题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数组中最长连续提交天数. 具体算法(Java版,直接AC) 1 import java.util.Scanner; 2 3 public class Main { 4 5 //计算数组中最长连续提交天数 6 public static int getMax(int[] array) { 7 int[] copy

hihoCoder 1049 后序遍历 最详细的解题报告

题目来源:后序遍历 解题思路:开始时我只知道先通过先序.中序求出二叉树,然后再后序遍历二叉树,这当然也是一种解题思路,但是会做一些无用功,比如:计算二叉树.其实,可以直接通过先序序列和中序序列直接求出后序序列的.思路如下: 1.取先序序列的第一个节点为根节点: 2.在中序序列中找到根节点的下标,将中序序列分成left和right两部分: 3.根据left和right的长度计算出先序序列中的根节点的左右孩子: 4.依次递归计算出左孩子,右孩子,返回 左孩子+右孩子+根节点. 具体算法(Java版,

hihoCoder 1062 最近公共祖先&#183;一 最详细的解题报告

题目来源:最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 题目描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. “嘿嘿,小Hi,你快过来看!”小Ho招呼道. “你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同一

hihoCoder 1041 国庆出游 最详细的解题报告

题目来源:国庆出游 解题思路(下面是大神的写的): 把题目中的序列称作S,树称作T.那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中的位置都恰好紧跟在x的后面,没有被其他节点隔开. 设x的子孙节点是abcd,那么--xabcd--, --xbcda-- 等等是合法的,--xab-cd--, --axbcd--, --x--abcd--, 都是不合法的('-'指其他节点).对于S中每个节点都做如上判断,如果有不合法的就输出NO,如

POJ 1057 File Mapping 最详细的解题报告

题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘f’开头,文件夹以‘d’开头,‘*’表示一个case的结束,‘#’表示所有输入内容结束. 解题思路:递归创建,最后递归输出.算法比较简单,我就不细说了,具体看代码: 具体算法(java版,可以直接运行) 1 import java.util.*; 2 3 public class Main { 4

A Broken Calculator 最详细的解题报告

题目来源:A Broken Calculator 题目如下(链接有可能无法访问): A Broken Calculator Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Dave's calculator is broken. His calculator halts when put more than K kinds of number. Dave wants to input an intege

POJ 1046 Color Me Less 最详细的解题报告

题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ Math.pow((left.green - right.green), 2)+ Math.pow((left.blue - right.blue), 2)) 表示两个不同颜色的之间的距离(以left和right为例,left和right分别为两种不同的颜色),现给出16组目标颜色,剩下的为待匹配的颜

POJ 1050 To the Max 最详细的解题报告

题目来源:To the Max 题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题. 解题方法:最大子序列之和的扩展 解题步骤: 1.定义一个N*N的矩阵state,state[j][k]用来存放矩阵的某行中第j到k个元素的最大值: 2.对于行如何处理呢?我们可以将第一行中的N个元素的所有组合的最大值存放在state中,如果有哪个值小于0,清零,因为它没有做任何贡献:定计算第二行时与第一行的值(全部大于等于0)进行累加,这样就完成了第一行与第二行的累