PAT 甲級 2023年9月8號 題解

2021-10-01 02:03:49 字數 2615 閱讀 5303

第一題:dfs+剪枝

k位數不能所有的數字都遍歷一遍,必須有選擇的。選擇k位數和為m的。

remain為剩下未分配數的位置的和。remain必須小於等於剩下的位數*9。因為若是大於的話,剩下的所有位數都為9,都滿足不了所有位加起來為m。比如k=3,m=20,如果第一位為1,則return。因為無論後面兩位是什麼,這個三位數的和都小於20。所以

這樣剪枝。就是在位數為k,所有位和為m的數里找了。

cnt為當前已經分配了數字的位數。remain為剩下的位數的數字之和。gdb為輾轉相除法。當時差點沒想起來,真的沒印象了,名字都記錯。判斷質數,等於2也返回false,是因為要求最大公約數為大於2的質數。

#includeusing namespace std;

typedef long long ll;

struct node

return true;

}int gdb(int a,int b)

}int sum(ll x)

return sum;

}void dfs(int cnt,ll num,int remain)

); }

return;

}for(int i=0;i<=min(remain,9);i++)

}int main()

else}}

return 0;

}

結果:

第二題:

經典的鏈與鏈之間的操作。用unordered_map存初始資料。再從第乙個結點開始遍歷。把兩個鏈存進v1,v2。

再遍歷v1,v2。把它按照規則存進ans。再輸出ans。注意最後乙個結點。以及位址的位數。要注意,是誰長誰是v1.而不是第乙個鏈。

#includeusing namespace std;

struct node;

int root1,root2,m;

unordered_maphash1;

vectorv1,v2,ans,temp;

int main()

while(cnt1=0)

for(int i=0;i結果:

第三題:

給出每個結點的兩個孩子與內容。輸出字尾表示式。首先,把所有的孩子,除了-1外都存下來。缺的哪乙個就是根節點。

再遍歷樹。注意,若結點,左右子樹都有,則後序,若無左子樹,則先序遍歷。把結果存進string,再輸出。

#includeusing namespace std;

struct node;

vectorv;

unordered_maphash1;

int n;

string ans;

string dfs(int now)

return str;

}int main()

int u = 1;

while(hash1[u]==true&&u<=n) u++;

ans = dfs(u);

cout結果:

第四題dijkstra過程為每一輪找到與原點最近的結點加入以經確定路徑集合。而這找最近點的順序可以形成序列。考察序列是否為dij序列。每一輪,看序列上對應的點,是否是這一步距離源點最近的點,若不是,則返回false。若是,則把該點加入已確定的點,再通過相應的邊更新其餘點距離源點的距離。直到所有點都確定了最短路徑。則返回true。

剛開始,我以為這題應該會很容易超時。所以準備用優先佇列,查詢距離源點最近點會快一點。後來發現不行。因為不是找最近點。而是確定序列上對應點是不是這一輪的最近點。因為,可能有距離相等值。所以後來按照普通dij,也沒超時。

還有乙個更好理解的方法就是。直接dij一輪。看序列上的點是否是按照距離源點以不減的方式排列的。是的那就是true。不是就是false。

#includeusing namespace std;

priority_queueq;

const int inf = 1<<30;

const int maxn = 1010;

int nv,ne,k;

int g[maxn][maxn];

int d[maxn];

bool vis[maxn];

vectorv;

bool dijkstra()}}

}if(cnt!=nv) flag = false;

return flag;

}int main()

{ fill(g[0],g[0]+maxn*maxn,inf);

scanf("%d%d",&nv,&ne);

v.resize(nv);

for(int i=0;i結果:

2023年9月8日pat甲級第二題

比較鏈長,較短的鍊錶逆序輸出,在資料中保留上乙個節點下標即可。每次輸出長鏈的兩個節點外加短鏈的乙個節點,同時讓當前值指向下乙個節點的下標。若最後長鏈仍有節點,則順序輸出即可。如下 include include include using namespace std const int maxn 1...

18年9月PAT甲級考試反思。

先讓我自嘲一波 我越是看重什麼,有時候,就越做不好什麼,真的很現實。與平時做題完全不一樣的心態,在考場上腦子一片空白,都不知道自己在做些什麼,在想些什麼。稍微說下經驗吧 1.第一題不見得是最簡單的,當然,因人而異吧。我是覺得這次第一次有點坑,至少做到最後我ac不了。反而第二題一次提交就ac了,然而此...

2023年9月8日pat乙級第一題

原題 7 1 b是a的多少倍 15 分 設乙個數 a 的最低 d 位形成的數是 a d 如果把 a d 截下來移到 a 的最高位前面,就形成了乙個新的數 b。b 是 a 的多少倍?例如將 12345 的最低 2 位 45 截下來放到 123 的前面,就得到 45123,它約是 12345 的 3.6...