原创 最優化(一)數學基礎

最優化內容 數學基礎 線性規劃 從2維到n維,統一的方法 對偶線性規劃 無約束的非線性規劃 最速下降法 牛頓法等 有約束的最優化 搜索 最優化問題 \quad在衆多可能的解中找出最佳決策,數學上來說就是找出函數極值。一般只能求

原创 PAT甲級1053 Path of Equal Weight (30 分)題解

\quad這是一個樹的dfs問題。爲了結果滿足題目要求的按照點權重降序排列,我們在讀入每一個非葉子節點的時候都要將其孩子節點按照點權大小從大到小排序。在dfs的過程中,從頂點0開始開始,依次遞歸遍歷,並記錄頂點到每一個節點的距離

原创 PAT甲級1102 Invert a Binary Tree (25 分)題解

\quad這個題分三步走,第一步建樹,第二步將這棵樹翻轉,第三步是輸出翻轉後的樹的層次遍歷和中序遍歷。其實在建樹的時候可以把一個節點左孩子的值賦給右孩子,右孩子的賦值給左孩子,這樣就一下完成了前兩步。與大部分解法不同,我用E[1

原创 PAT甲級1115 Counting Nodes in a BST (30 分)題解

\quad這個題目的是考察我們如何建立一棵二叉搜索樹,並統計每一層節點數目。我們在建樹的過程中便可以記錄每一層節點所屬層數,並統計每一層節點個數,更新最大深度。 #include <stdio.h> using namespace

原创 PAT甲級1110 Complete Binary Tree (25 分)題解

\quad這個題考察的是完全二叉樹的問題。首先,我們需要明白完全二叉樹的一個性質:N個節點的完全二叉樹可以用大小爲N的數組存儲,假設數組索引爲1的存放根節點,那麼其左右孩子節點索引爲2和3。即假設一個父親節點索引爲n,那麼其左

原创 PAT甲級 1094 The Largest Generation (25 分) 題解

\quad記錄樹的每一層節點個數,輸出節點數目最大的一層的信息。DFS和BFS都可以,因爲數據量很小,我們直接用DFS,主要是寫起來簡潔 (懶) #include <iostream> #include <vector> usi

原创 PAT甲級 1004 Counting Leaves (30 分) 題解

\quad樹的層次遍歷,並記錄每一層葉子節點個數。葉子節點即爲無孩子的節點,若用vector存儲每個節點的孩子節點,那葉子節點對應的vector大小爲0。樹的層次遍歷時記得用標示符記錄每一層結束位置,我用的是-1,跟在每一層最後

原创 PAT甲級1079 Total Sales of Supply Chain (25 分)題解

\quad樹的遍歷,需要記錄每一個頂點是哪一層,當遍歷到葉子節點時進行計算。可以用bfs或者dfs,如果數據量很大的情況下建議用bfs,不然可能爆棧。不過這個題數據量不大,給出bfs和dfs兩個版本的程序。 BFS版本 #inc

原创 PAT甲級1089 Insert or Merge (25 分)題解

\quad這個題主要考察插入排序和歸併排序的實現。每一步插入排序或歸併排序後都看看是否與題目給定的目標序列一致u,若一致則打印當前排序類型和下一次排序結果。關於插入排序和歸併排序請移步至博客,裏面包含了這兩種排序的代碼和解釋。

原创 PAT甲級 1031 Hello World for U (20 分) 題解

\quad這是PAT甲級裏面唯一一個打印圖形的題,很簡單,整個字符串分爲三段n1,n2,n3,n1+n2+n3=字符串長度len+2,所以n1=n2=(len+2)/3, n3=len+2-2*n1。打印的時候逐行打印,除去最後

原创 PAT甲級1100 Mars Numbers (20 分)題解

\quad這個題稍微有點麻煩,需要分別處理數字轉火星文和火星文轉數字兩種情況。不過數字最高兩位,處理起來分別討論即可。程序如下: #include <iostream> using namespace std; string o

原创 PAT甲級 1036 Boys vs Girls (25 分) 題解

\quad找出成績最好的女生和成績最差的男生,分性別比較並存儲相應信息即可。 #include <iostream> using namespace std; int main(int argc, char const *ar

原创 排序算法詳解——選擇、插入、歸併和快排

一、選擇排序 特點:每次從待排序序列中選取最小值最爲當前元素值 流程:已排好序的數組爲A[0,i-1],將未排序序列A[i,n)中最小值賦給A[i]。 const int maxn = 10000; int A[maxn]; vo

原创 PAT甲級 1058 A+B in Hogwarts (20 分) 題解

\quad英文比較難懂,不過只需要知道29個Knuts等於1個Sickle,17個Sickle等於1個Galleon即可。我把兩個數都轉化爲多少個Knuts,加起來再轉化回去這種思路做。不過需要注意Galleon數據能達到107

原创 PAT甲級1006 Sign In and Sign Out (25 分)題解

\quad直接比較時間點大小即可,而時間點字符串很標準,長度都一致,直接用字符串大小比較即可完成。 #include <iostream> using namespace std; int main(int argc, cha