2021春季PAT甲級

2021-10-22 01:51:10 字數 2639 閱讀 3156

從零基礎開始備考,備考了45天,最後拿了94分,有些遺憾

最後一道題,最後乙個測試點沒有過,今天偶然在看晴神筆記的時候,知道了是弗洛伊德演算法實現錯誤,請看第四題詳解。

建立素數表,從最大的間隔開始列舉,這樣不會超時。

#includeusing namespace std;

int n, maxp;

int isp[100005];

int main()

} cin>>n>>maxp;

if(n==1)

cout << maxp;

return 0;

} int start=maxp/(n-1);

int first = -1;

while(start--)

int cnt=0;

for (int i = 2; i + start * (n - 1) <= maxp;i++)

}if(istrue)

} if(first!=-1)

} if(first==-1)

cout第二題非常簡單,就是讀入資料,把日期轉換成int型別,然後根據離開時間從小到大排序,然後一次遍歷統計人數。

#includeusing namespace std;

int n;

struct node

}cout建立大根堆,模板題目。

建立好大根堆之後,使用map記錄下key所在的位置,即索引,通過索引判別兩個節點的關係。

#includeusing namespace std;

int heap[1005];

int si=0;

int n;

int m;

mapmp;

void init()

void insert(int value)

string str;

getchar();

for(int i=1;i<=n;i++)

for(int i=0;i不知道咋回事最後乙個測試點沒有通過,我的思路是讀入資料,建立鄰接矩陣,然後跑弗洛伊德演算法,因為要求出任意兩點間的最短路,dis[i][j]表示i到j的最短距離。求出來任意兩點的最短路之後,使用dfs從0點開始依次找最小距離遍歷,遍歷過程中標誌vis[i]為true,計算ans,sum。dfs執行完之後,判斷vis[i]為false就是訪問不到的節點。

後來,參考部落格,晴神筆記,知道了是弗洛伊德演算法三重迴圈順序問題,列舉的中間節點應該在最外層。首先,它是運用了動態規劃的思想來進行問題求解。動態規劃解題的關鍵在於找好子結構。floyd構造的結構非常巧妙:找i和j之間通過編號不超過k(k從1到n)的節點的最短路徑(一定要注意,這裡是當前最短路徑,當k=n時達到最終最短路徑)。為了便於說明,我們可以弄乙個三維陣列f[k][i][j]表示i和j之間可以通過編號不超過k的節點的「最短路徑」。對於k-1到k,只有兩種可能,經過編號為k的點,要麼不能找到一條從i到j的更短路,此時有f[k][i][j] = f[k-1][i][j] ;要麼能找到,那這個最短路徑一定是d[i][k]+d[k][j],那麼就用這個較小的距離去更新d[i][j]。綜合以上兩種情況,f[k][i][j] = min(f[k-1][i][j] , f[k-1][i][k]+f[k-1][k][j])。所以說弗洛伊德演算法更新編號不超過k的節點的最短路徑要基於k-1來更新的。

具體實現就比較簡單了,對任意兩點間的距離,我們初始化他們為無窮大(這裡無窮大是一種形象的說法),然後用鬆弛技術進行距離的更新。然後用三層迴圈的話,最外層空間就可以省下來了,因為f[k]只與f[k-1]有關。

#include using namespace std;

const int inf = 0x3f3f3f3f;

vectorans;

int sum = 0;

int dis[500][500];

int n;

int m;

bool vis[500];

void dfs(int s)

} }if (u == -1)

vis[u] = true;

ans.push_back(u);

sum += dis[s][u];

dfs(u);

}int main()

for (int k = 0; k <= n; k++) //注意中間節點一定要放在最外層

}} }

int s = 0;

vis[s] = true;

dfs(0);

bool istrue = true;

for (int i = 1; i <= n; i++) }

cout << "0";

for (int i = 0; i < ans.size(); i++)

cout << endl;

if (istrue)

else

}for (int i = 1; i <= n; i++)

}} return 0;

}

題解 2021PAT春季甲級

7 1 arithmetic progression of primes 篩法預處理區間內的素數 因為已知數列長度,如果知道數列第 一 二個數即可求得整個數列 暴力列舉前兩個數,看後續是否滿足兩個條件 在所有找出的符合的數列中按題目要求得到最後應該輸出的那個數列 特殊情況 n 1 n 2 m 2 n...

PAT甲級2020春季真題題解

簽到題,可以使用stoi將字串轉換為數字,然後試除法判斷是否為素數。include include using namespace std bool check const string s intmain 取子串 使用unordered set來做,比set效率高,如果不要求集合有序的話。incl...

PAT甲級2019春季真題題解

簽到題,素數不需要用篩法,直接o sqrt n 即可。熱身題,字串處理,使用集合判斷。稍難,圖論 並查集,還有要理解題意 個人認為pat最難的點 include include include define ac cin.tie 0 cin.sync with stdio 0 using names...