1. 程式人生 > >HihoCoder1052基因工程(簡單模擬題)

HihoCoder1052基因工程(簡單模擬題)

修改方法 ace lib stream 方法 div 最小 mes 大寫

描述

小Hi和小Ho正在進行一項基因工程實驗。他們要修改一段長度為N的DNA序列,使得這段DNA上最前面的K個堿基組成的序列與最後面的K個堿基組成的序列完全一致。

例如對於序列"ATCGATAC"和K=2,可以通過將第二個堿基修改為"C"使得最前面2個堿基與最後面兩個堿基都為"AC"。當然還存在其他修改方法,例如將最後一個堿基改為"T",或者直接將最前面兩個和最後面兩個堿基都修改為"GG"。

小Hi和小Ho希望知道在所有方法中,修改堿基最少的方法需要修改多少個堿基。

輸入

第一行包含一個整數T(1 <= T <= 10),代表測試數據的數量。

每組測試數據包含2行,第一行是一個由"ATCG"4個大寫字母組成的長度為N(1 <= N <= 1000)的字符串。第二行是一個整數K(1 <= K <= N)。

輸出

對於每組數據輸出最少需要修改的堿基數量。

樣例輸入

2  
ATCGATAC  
2  
ATACGTCT
6 

樣例輸出

1  
3   

題意:

給定一個字符串,問改變最小的字符,使得前k個字符和後k個字符相同。

思路:

模擬即可。然而我是用的dfs+排序,把有關系的分到一個組,然後這個組的最小改動=字符數目-最多的一種的數目。比如aaaabbc,肯定是把其他改成a。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include
<cstring> #include<algorithm> using namespace std; const int maxn=1010; int used[maxn]; char chr[maxn]; int cnt,q[maxn],K,L,ans; void dfs(int x) { used[x]=1;q[++cnt]=chr[x]-A; if(x<=K&&!used[L-K+x]&&x-K+L<=L&&L-K+x>=1) dfs(L-K+x);
if(x>L-K&&!used[x+K-L]&&x+K-L<=L&&x+K-L>=1) dfs(x+K-L); return ; } int main() { int T,i,j; scanf("%d",&T); while(T--){ scanf("%s",chr+1); scanf("%d",&K); memset(used,0,sizeof(used));ans=0; L=strlen(chr+1); for(i=1;i<=L;i++){ if(!used[i]&&(i<=K||i>L-K)){ cnt=0; dfs(i); sort(q+1,q+cnt+1); int delta=0,tmp=0,pre=-2; for(j=1;j<=cnt;j++){ if(q[j]==pre) tmp++; else { delta=max(delta,tmp); pre=q[j];tmp=1; } } delta=max(delta,tmp); ans+=cnt-delta; } } printf("%d\n",ans); } return 0; }

HihoCoder1052基因工程(簡單模擬題)