第一題: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...