【PAT甲级最新题解】PAT甲级2020.7月春季考试满分题解(附代码)
寫在前面:這次題目雖然大多數(shù)是模擬題且不算難,但是題面其實不算友好,不少同學(xué)因為題目描述而錯失滿分。
A:
題意:給定一個數(shù)字串,問每一個前綴串是否是素數(shù)。
模擬題不多解釋。
#include<cstdio> #include<algorithm> #include<cstring> #include<stack> #include<queue> #include<string> #include<iostream>using namespace std; const int MAX = 2e5 + 6; string s; bool isprime(int x) {if(x < 2) return 0;for(int i = 2; i*i<=x; i++) {if(x%i == 0) return 0;}return 1; } int main() {cin>>s;int len = s.length();int flag = 1;for(int i = 0; i<len; i++) {cout << s.substr(i) ;int x = stoi(s.substr(i));//printf("%d",x);if(isprime(x) == 1) printf(" Yes\n");else {flag = 0;printf(" No\n");}}if(flag == 1) {printf("All Prime!\n");}return 0 ; }B:
題意:n個人玩牌m盤。剛開始桌子上有兩張牌,每盤中依次輪每個人出牌,牌放到桌子上,每一盤中這個人不出局當(dāng)且僅當(dāng)這個人出的牌桌子上都沒有,并且恰好為桌子上某兩個牌的數(shù)值的差的絕對值。然后按要求輸出每一盤出局的人以及最后是否有winner。
題面是真的坑,剛開始在輸出格式這里卡了半天,好在最后AC了。
#include<cstdio> #include<algorithm> #include<cstring> #include<stack> #include<queue> #include<string> #include<iostream> #include<set> using namespace std; const int MAX = 4e5 + 6;int a,b; int n,m; int val[102][1003]; int out[102];//是否出局 vector<int> hx;//候選的數(shù)字 vector<int> vv;//每一局淘汰的人 bool is[MAX],diff[MAX]; int main() {cin>>a>>b;cin>>n>>m;for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {scanf("%d",&val[i][j]);}}is[a]=1;is[b]=1;diff[abs(a-b)]=1;hx.push_back(a);hx.push_back(b);int cnt_out = 0;for(int j = 1; j<=m; j++) {//每一局 vv.clear();for(int i = 1; i<=n; i++) {//每個人 if(out[i] == 1) continue;int now = val[i][j];int jixu = diff[now];if(is[now] == 1) jixu = 0;if(jixu == 1) is[now] = 1;//這里加不加if都能AC,但是題面意思并不清晰。 if(jixu == 0) {cnt_out++;out[i] = 1;vv.push_back(i);continue;}for(int k = 0; k<hx.size(); k++) {diff[abs(hx[k]-now)]=1;}hx.push_back(now);}if(vv.size() > 0) {for(int k = 0; k<vv.size(); k++) {printf("Round #%d: %d is out.\n",j,vv[k]); // printf(" %d",vv[k]);}//printf(" is out.\n");}if(cnt_out == n) {printf("No winner.\n");return 0;}}if(cnt_out == n) {printf("No winner.\n");return 0;}printf("Winner(s):");for(int i = 1; i<=n; i++) {if(out[i] == 0) {printf(" %d",i);}}printf("\n");return 0; } /* 20 12 2 2 8 4 8 200*/C:
題意:給一張無向圖,相鄰點不能是相同顏色,給你m種染色方案,問你每一種是否合法。
經(jīng)典的染色問題,求解是np的,但是驗證解是線性的,水題。
#include<cstdio> #include<algorithm> #include<cstring> #include<stack> #include<queue> #include<string> #include<iostream> #include<set> using namespace std; const int MAX = 4e5 + 6; int val[MAX]; int n,r,k,m; pair<int,int> pr[MAX]; set<int> ss; int main() {cin>>n>>r>>k;for(int a,b,i = 1; i<=r; i++) {scanf("%d%d",&a,&b);pr[i].first = a;pr[i].second = b;}cin>>m;for(int i = 1; i<=m; i++) {ss.clear();for(int j = 1; j<=n; j++) {scanf("%d",&val[j]);ss.insert(val[j]);}if(ss.size() > k) {printf("Error: Too many species.\n");}else if(ss.size() < k) {printf("Error: Too few species.\n");}else {int flag = 1;for(int a,b,q = 1; q<=r; q++) {a = pr[q].first;b = pr[q].second;if(val[a] == val[b]) {flag = 0;break;}}if(flag == 1) puts("Yes");else puts("No");}}} /* 6 8 3 2 1 1 3 4 6 2 5 2 4 5 4 5 6 3 6 5 1 2 3 3 1 2 1 2 3 4 5 6 4 5 6 6 4 5 2 3 4 2 3 4 2 2 2 2 2 2 */D:
題意:定義了一種排序方式,讓你用這種排序方式把給定的數(shù)字進行排序。
做法:拿個set維護窗口內(nèi)的數(shù)就可以了,不難。
注意題面是int范圍,也就是代表可以有負(fù)數(shù)。(是-1e11啊不是1e-11,Orz)
這題剛開始一直T,本來想是不是卡了log,強行讓你用并查集進行區(qū)間合并,交卷還剩半小時的時候發(fā)現(xiàn)是自己寫掛了,log是可以過的。
#include<cstdio> #include<algorithm> #include<cstring> #include<stack> #include<queue> #include<string> #include<iostream> #include<set> using namespace std; typedef long long ll; const int MAX = 2e5 + 6; int n,m,ok[MAX]; ll a[MAX]; set<pair<ll,int> > ss; set<int> ori; set<int> cur; vector<ll> vv; vector<pair<int,ll> > cc; int f[MAX]; int getf(int v) {return f[v] == v ? v : f[v] = getf(f[v]); } int main() {cin>>n>>m;for(int i = 1; i<=n; i++) scanf("%lld",a+i),f[i]=i,ori.insert(i);int cur_ans = 0;for(int times = 1; times<=n; times++) {ss.clear();vv.clear();cc.clear();pair<ll,int> last = make_pair((ll)-1e11,0);for(set<int>::iterator itt = ori.begin(); itt != ori.end(); ++itt) {int pos = *itt; if(ss.size() < m) {ss.insert(make_pair(a[pos],pos));}if(ss.size() == m) {set<pair<ll,int> >::iterator it = ss.lower_bound(last);if(it == ss.end()) {break;}else {pair<ll,int> now = *it;cc.push_back(now.second);vv.push_back(now.first);ss.erase(it);last = now;}}}set<pair<ll,int> >::iterator it = ss.lower_bound(last);for(;it != ss.end(); ++it) {pair<ll,int> now = *it;cc.push_back(make_pair(now.second,now.first));ok[now.second] = 1;vv.push_back(now.first);//ss.erase(it);last = now; }int up = vv.size();cur_ans += up;for(int i = 0; i<up; i++) {printf("%lld%c",vv[i],i == up-1 ? '\n' : ' ');}if(cur_ans == n){break;}for(int i = 0; i<cc.size(); i++) {ori.erase(cc[i]);}} return 0; }有不懂的地方歡迎評論一起討論~
?
另外,如果你要問我怎么發(fā)現(xiàn)的輸出格式的問題,那么下面這張圖將回答這個問題:
總結(jié)
以上是生活随笔為你收集整理的【PAT甲级最新题解】PAT甲级2020.7月春季考试满分题解(附代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 首款可定制的骁龙8+旗舰 三星Galax
- 下一篇: 第一款无挖孔的骁龙8+旗舰 ROG游戏手