南京大学计算机考研机试,2018南大CS考研机试答案
Problem A
第一題最笨的思路(by:LittleSec)
都規定輸入的最大深度是5了,所以直接窮舉深度為1-5的滿二叉樹前序->中序方案,主要就是下標轉換:
eg:輸入ABC對應的下標是012,輸出是順序變成102而已。
eg:高度為3的情況則構造下標數組:a[] = {2,1,3,0,5,4,6},假設輸入的字符串存在str,那么輸出就是
for(int i = 0; i < pow(2,n)-1; i++)
{
if(str[a[i]]=='#') continue;
else cout << str[a[i]];
}
5種情況而已,草稿紙上列舉不用10分鐘。
親測能通過所有測試樣例。(:逃
第一題稍微不那么笨但還是很笨的思路(by:六月雪Yuni)
只要知道如何從滿二叉樹的先序遍歷推出原樹就可以做。根據定義,滿二叉樹的某一棵子樹的先序遍歷是[根][左子樹序列][右子樹序列]的形式,而且左子樹序列和右子樹序列長度相同。那么先取出根,然后遞歸處理左子樹和右子樹就可以構造出原樹。得到原樹之后中序遍歷亂搞就可以啦。
另外值得注意的是有一些原本可以得到300分的大佬因為讀題失誤,把#節點認為是不存在的節點,而忽略了#節點也可能作為父節點的情況,導致本題只能做到80分或90分。嗚呼哀哉————讀題果然也是重要的一環呢。
這個思路得到了AC(100pts)。
偽代碼:
void ConstructTree(int l, int r){
root = s[l];
root.leftChild = s[l+1];
root.rightChild = s[l+1+(r-l)/2];
ConstructTree(l+1,l+(r-l)/2);
ConstructTree(l+(r-l)/2+1,r);
}
void Output(int root){
Output(root.leftChild);
print(root);
Output(root.rightChild);
}
Problem B
第二題菜雞拿分經驗貼(by:還是最笨的LittleSec
題中給定輸入是s t,千萬認為s一定比t小。當s比t大的話,也就是農夫在牛的后面,那么農夫每次都只能執行后退即-1操作,因此最短步數就是s-t步。親測能通過4個測試樣例(噗
第二題思路1 廣度優先搜索(by:六月雪Yuni)
直接從點s開始BFS。用一個數組vis[]維護元素x是否被加入過隊列,d[]記錄擴展到元素x需要搜索幾步。
每次取出隊首元素fr時,測試fr+1是否在隊中,不在則加入隊列,并且更新d[fr+1]。對fr-1和fr*2同樣這么做。
需要注意的是加入隊列的元素不能是負數,因為0<=s,t<=100000,加入負數沒有意義。fr*2也不能超過100000。
這個思路做到了AC(100pts)。
部分代碼:
int BFS(int s, int t){
memset(d,0x3f,sizeof(d)); //這一步將d中所有元素初始化為一個“無限大”,即在題目語境里非常大的數
const int inf = 0x3f3f3f3f;
d[s] = 0;
queue Q;
while(!Q.empty())Q.pop();
Q.push(s);
while(!Q.empty()){
int fr = Q.front();
if(fr-1>=0 && d[fr-1]>=inf){
Q.push(fr-1);
d[fr-1] = d[fr] + 1;
}
if(d[fr+1]>=inf){
Q.push(fr+1);
d[fr+1] = d[fr] + 1;
}
if(fr*2<=100000 && d[fr*2]>=inf){
Q.push(fr*2);
d[fr*2] = d[fr] + 1;
}
Q.pop(fr);
}
return d[t];//因為我們知道本題一定有解,所以不判定是否存在。
}
第二題思路3 DP
聽說有大佬用動態規劃解了這題,待補充。
Problem C
第三題思路1 DP(by 筆試爆炸啦qaq)
我們令dp[i][j]為串s[1..i]和t[1..j]的最長公共子序列長度。例如,對s="abcde"和t="acefg",s[1..4]="abcd",t[1..3]="ace",所以dp[4][3]=2。(最長公共子序列是"ac")
這樣,就有了以下的遞推式:
s[i] == t[j] : dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]+1).
s[i] != t[j] : dp[i][j] = max(dp[i-1][j], dp[i][j-1]).
初始條件 dp[0][0] = 0
時間復雜度O(L^2),L = max(s.length, t.length).
然后dp[s.length][t.length]就是串s和串t的公共子序列長度。將這個過程重復n次、取最大就可以求得題目的解。因為1<=n<=200,L<=2000,所以可以在時限內得到解。
這個思路得到了AC(100pts)。
總結
以上是生活随笔為你收集整理的南京大学计算机考研机试,2018南大CS考研机试答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪里有动作电影看?
- 下一篇: 计算机二级理工类报哪个,计算机二级考哪一