HihoCoder1052基因工程(簡單模擬題)
阿新 • • 發佈:2017-12-05
修改方法 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基因工程(簡單模擬題)