PAT 乙級 25 分題
- 1005 繼續(3n+1)猜想 (25)
測試點 3,4 段錯誤。因為對陣列下標限制的判斷寫錯了,應該寫在取陣列元素的前面。
if(tmp<maxn&&cnt[tmp]==1)
- 1010 一元多項式求導 (25)
如果第一次就輸入 0 多項式,那就輸出 0 0。否則 0 多項式不輸出。
- 1015 德才論 (25)
模擬排序題。比較簡單。
- 1020 月餅 (25)
測試點 2 錯誤。這個題前兩個輸入說是正整數,後面的輸入只說了是正數,所以要用 double 來儲存。int 改成 double 測試點 2 就過了。
- 1025 反轉連結串列 (25)
測試點 6 錯誤。因為輸入裡可能有無效的結點。
例如這種輸入:
00000 6 3
00000 1 11111
11111 2 22222
22222 3 -1
33333 4 44444
44444 5 55555
55555 6 -1
- 1030 完美數列(25)
測試點 3 錯誤。
應該是 n = 1 的資料:
1 2
7
我用的是二分的辦法。ans 最小值應為 1。
- 1035 插入與歸併(25)
測試點 3,5,6 出錯。
這個題花了我兩個多小時。
我看了演算法筆記,說原始序列不算中間序列。但題目裡並沒有給出這種保證。
所以我開始想的是,先比較原陣列和結果陣列,如果相等,就做一次插入排序。然後輸出。
但是對這種資料就不行:
4
2 3 1 4
2 3 1 4
對於插入排序來說,2 3 1 4 的下一輪,還是 2 3 1 4,再下一輪就是 1 2 3 4。
因為第一輪是正常序列,不需要排序。所以我開始還準備設一個 flag,如果排序一輪後這輪沒變化,就再做一次排序。
但答案好像沒有這個意思。只是說原陣列不算中間序列。
於是就是第一輪,排序,然後比較,如果相同,就再一輪,輸出。
另一個讓我花了很長的時間的是,歸併排序的迴圈條件,我一直記不得。也是沒有理解。外層迴圈是 step=2;step/2<n;step*-2;
i = 0;i<n;i+=step
- 1040 有幾個PAT(25)
測試點 3,4錯誤。因為忘了對 1000000007 取餘數。而且中途需要用 long long 儲存相乘的結果,免得溢位。
- 1045 快速排序(25)
測試點 2,格式錯誤。在輸入結果為0的時候,還要再輸出一個空行。
void print(vector<int> vv){
printf("%lu\n",vv.size());
for(int i=0;i<vv.size();i++){
printf("%d",vv[i]);
if(i<vv.size()-1)printf(" ");
}
if(vv.size()==0)printf("\n");
}
- 1050 螺旋矩陣(25)
測試點 1,3,7 浮點錯誤。因為 m 和 n 沒算對。
- 1055 集體照 (25)
這題用 vector 儲存排序後應該輸出的每行的下標。
- 1060 愛丁頓數(25)
測試點 3 出錯。因為如果是這樣的資料:
3
0 0 0
那答案應該是 0 天 超過 0 公里。
這個題目 E 天超過 E 公里,我開始很難理解,看了別人的題解才懂了一點。
從大往小掃描 2 3 6 6 7 7 8 8 9 10
10,表示 1 天超過 1 公里。
9,2 天超過 2 公里。
8,3 天超過 3 英里
8,4 天超過 4 英里
7,5 天超過 5 英里
7,6 天超過 6 英里
6,7天超過7英里(矛盾)
也就是 E = 6。
- 1065 單身狗(25)
這題用集合來做。遍歷集合的程式碼 set<int> iterator it=ss.begin();it!=ss.end();it++
- 1070 結繩(25)
這題也一個排序數學題。
- 1075 連結串列元素分類(25)
套路明顯,比較簡單。
- 1080 MOOC期終成績 (25)
測試點 3 出錯。
我開始是這麼寫的:
if(stu[i].mg==0)printf(" -1");
else printf(" %d",stu[i].mg);
if(stu[i].fg==0)printf(" -1");
else printf(" %d",stu[i].fg);
我把所有人的期中期末設為0,如果最後還是0,就表示他沒考,輸出-1。
但這是有問題的,萬一一個學生,期中考0分,期末考100分。
應該輸出的是 0 100,而不是 -1 100。
所以加了這一行就好了 stu[order].mg=stu[order].fg=-1;
- 1085 PAT單位排行 (25)
模擬排序題。