UVa 1368 - DNA Consensus String

这是连续第8次1Y了,哈哈哈,不过,不过这题看起来挺吓人,读完才知道就是让球一个目标DNA序列,和每个所给序列最相近。不是从里面选,第一次就是这么理解的然后。。。。。是自己用A C G T中组合。如果有多解选字典序最小的。

题目定位 : 字符串水题。 貌似有点贪心的意思。

上Java代码 :

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
	    int t = scan.nextInt();
	    while(t-- > 0) {
	    	int m = scan.nextInt();
	    	int n = scan.nextInt();
	    	StringBuilder sb = new StringBuilder();
	    	String s;
	    	DNA[] dna = new DNA[m + 1];
	    	for(int i=0; i<m; i++) {
	    		s = scan.next();
	    		dna[i] = new DNA(s, 0);
	    	}
	    	int[] cnt = new int[4];
	    	int dis = 0;
	    	for(int j=0; j<n; j++) {
	    		Arrays.fill(cnt, 0);
	    		for(int i=0; i<m; i++) {
	    			if(dna[i].str.charAt(j) == 'A') {
	    				cnt[0] ++;
	    			}
	    			if(dna[i].str.charAt(j) == 'C') {
	    				cnt[1] ++;
	    			}
	    			if(dna[i].str.charAt(j) == 'G') {
	    				cnt[2] ++;
	    			}
	    			if(dna[i].str.charAt(j) == 'T') {
	    				cnt[3] ++;
	    			}
	    		}
	    		int max = cnt[0];
	    		char ch = 'A';
	    		for(int k=1; k<4; k++) {
	    			if(cnt[k] > max) {
	    				max = cnt[k];
	    				if(k == 1) {
	    					ch = 'C';
	    				}
	    				if(k == 2) {
	    					ch = 'G';
	    				}
	    				if(k == 3) {
	    					ch = 'T';
	    				}
	    			}
	    		}
	    		if(ch == 'A') {
	    			dis += cnt[1] + cnt[2] + cnt[3];
	    		}
	    		if(ch == 'C') {
	    			dis += cnt[0] + cnt[2] + cnt[3];
	    		}
	    		if(ch == 'G') {
	    			dis += cnt[0] + cnt[1] + cnt[3];
	    	    }
	    		if(ch == 'T') {
	    			dis += cnt[1] + cnt[2] + cnt[0];
	    		}
	    		sb.append(ch);
	    		
	    	}
	    	System.out.println(sb);
	    	System.out.println(dis);
	    }
	    

	}

}
class DNA {
	public String str;
	public int cnt;
	public DNA(String str, int cnt) {
		this.str = new String(str);
		this.cnt = cnt;
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值