演算法競賽入門經典第3章習題

2021-08-08 17:47:07 字數 3184 閱讀 5140

給出乙個有o和x組成的串(長度為1~80),統計得分。每個o的得分為目前連續出現的o的個數,x的得分為0。例如,ooxxoxxooo的得分是為1+2+0+0+1+0+0+1+2+3。按照題目說的做就行了,超簡單。

#include#include#define maxn 80

char s[maxn];

int main()

printf("%d\n", tot);

return 0;

}

給出一種物質的分子式(不帶括號),求分子量。本題的分子式只包含4種原子,分別為c,h,o,n,原子量為12.01,1.008,16.00,14.01(單位:g/mol)。例如,c6h5oh的分子量為94.108 g/mol。按照題目做就行了。

#include#include#define maxn 80

int main()

case 'h':

case 'o':

case 'n':

} if(s[i+1] > '0' && s[i+1] <= '9')

tot += score * num;

num = 1;

} printf("%.3f\n", tot);

return 0;

}

把前n(n <= 10000)個整數順次寫在一起:123456789101112...數一數0~9各出現多少次(輸出10個整數,分別是0,1,2,..., 9出現的次數)。

#include#include#define maxn 10005

char s[maxn];

int a[10];

int main()

如果乙個字串可以由某個長度為k的字串重複多次得到,則稱該串以k為週期。例如,abcabcabcabcabc 以3為週期(注意,它也以6 和 12 為週期)。輸入乙個長度不超過80的字串,輸出其最小週期。解法就是:

從小到大列舉各個週期(即從1到字串大小),一旦符合條件就立即輸出。當不是週期串時輸出

的最小週期即為其本身長度。

#include#include#define maxn 101

char s[maxn];

int main()

}if(flag) //如果是週期,即刻跳出

break;

}printf("%d", i);

return 0;

}

有乙個5*5的網路,其中恰好有乙個格仔是空的,其他格仔各有乙個字母。乙個有4種指令:a, b, l, r, 分別表示把空格上、下、左、右的相鄰字母移到空格中。輸入初始網格和指令序列(以數字0結束),輸出指令執行完畢後的網路。如果有非法指令,應輸出" this puzzle has no final configuration."。

執行arrbbl0前

trgsjx

doki

mvln

wpab

euqh

cf執行arrbbl0後

trgsjx

okli

mdvb

nmpa

euoh

cf解法:輸入初始網格和指令序列,初始網格用二維陣列表示,分別按照指令順序進行將字母

移到空格,遇到0就結束。

#include#include#define n 5

char s[n][n];

int main()

}fflush(stdin);

while((c = getchar()) != eof)

case 'b':

case 'l':

case 'r':

default: }}

printf("\n");

for(i = 0; i < n; i++)

return 0;

}

輸入乙個r行c列(1<=r, c<=10)的網格,黑格用「*」表示,每個白格都填有乙個字母。如果乙個白格的左邊相鄰位置或者上邊相鄰位置沒有白格(可能是黑格,也可能出了網格邊界)則稱這個白格是乙個起始格。首先把所有的起始格按照從上到下的、從左到右的順序編號為1,2,3,···,如圖所示:

r行c列網格

123*456

*7*8

910*11

12*1314*15

16*17*

18*1920

接下來要找出所有橫向單詞(across)。這些單詞必須從乙個起始格開始,向右延伸到乙個黑格的左邊或者整個網格的最右邊。最後找出所有豎向單詞(down)。這些單詞必須從乙個起始格開始,向下延伸到乙個黑格的上邊或者整個網格的最下行。

#include#include#define max 12

int main(void)}}

if(count != 1)

printf("\n");

printf("puzzle #%d:\n", count++);

printf("across\n");

for(i = 0; i < r; i++)

printf("%3d.%c", num[i][j], buf[i][j]);//格式需要

j++;

while(j < c && buf[i][j] != '*') //當輸出到行結尾時結束或是黑格時

printf("\n");}}

printf("down\n");

for(i = 0; i < r; i++)

printf("\n");}}

}return 0;

}

輸入m個長度均為n的dna序列,求乙個dna序列,到所用序列的總hamming距離盡量小。兩個等長字串的hamming距離等於字元不同的位置個數,例如,acgt和gcga的hamming距離為2(左數第1,4個字元不同)。

輸入整數m和n(4<=m<=50, 4<=n<=100),以及m個長度為n的dna序列(只包含字母a,c,g,t),輸出到m個序列的hamming距離和最小的dna序列和對應的距離。如有多解,要求為字典序最小的結,例如,對於下面5個dna序列,最優解為taagatac。

tatgatac

taagctac

aaagatcc

tgagatac

taagatgt

演算法競賽入門經典(第2版)例題(第3章)

例題 3 1 tex中的引號 tex quotes include intmain else printf c c return0 例題 3 2 wertyu include char s 1234567890 qwertyuiop asdfghjkl zxcvbnm,int main 例題 3 3...

演算法競賽入門經典習題2 6

用1,2,3,9組成3個三位數abc,def和ghi,每個數字恰好使用一次,要 求abc def ghi 1 2 3。按照 abc def ghi 的格式輸出所有解,每行乙個解 思路 如果首先要保證每個數字都用一次,那麼這個題就會變得很麻煩,所以就先讓abc,def,ghi產生倍數關係然後對 這三個...

演算法競賽入門經典 習題3 7

uva1368 dna consensus string 本來以為題目是要在已有序列中找乙個最小的序列,後來仔細讀了下題才發現是要構造乙個距離最小的序列。感覺這道題應該就是貪心演算法吧?每一位和已有序列的對應位差得越少,總體也就越少。include include include include u...