PAT 2019 秋
考试的还行。不过略微有点遗憾,但是没想到第一题会直接上排序和dfs,感觉这次的题目难度好像是倒着的一样。哈哈哈哈。
第一题实在是搞崩心态,这道题给我的感觉是,可以做,但事实上总是差点啥。
第二题,第三题,把我的心态稳住了,不然的话这次考试可能会雪崩。这两道题目都是提交一次,直接全红。
接着二三题带来的信心把第四题搞定了,好像提交了两次。
然后就又开始死磕第一题,关键是当时自己以为第一题不应该用dfs,就一直在修改细节。╮(╯▽╰)╭,还是超时。
感觉PAT不算很难,但是在新的环境、计时、排队提交等因素的影响下,对心理素质有相当大的考验(至少对不少人来说),第一题可能直接就导致整场考试稳不住了。
无论如何实力足够强可以减少这些因素的影响。
下面是考试时候的代码。
7-1 Forever
当时觉得第一题,3000ms, 直接暴力计算了。(最后一个点超时)只需要把第二个for循环改成
for(int j = fac[K]+9; j < fac[K+1]; j += 10)
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 #include <iostream> 5 #include <map> 6 #include <algorithm> 7 using namespace std; 8 int N, K, m; 9 typedef struct NODE{ 10 int a, n; 11 NODE(int tmpN, int tmpA):a(tmpA),n(tmpN){} 12 }node; 13 int gcd(int a, int b){ 14 if(b == 0) return a; 15 return gcd(b, a%b); 16 } 17 bool isPrimeB2(int n){ 18 if(n <= 2) 19 return false; 20 int sqr = (int)sqrt(1.0*n); 21 for(int i = 2; i <= sqr; ++ i) 22 if(n % i == 0) 23 return false; 24 return true; 25 } 26 int getSumOfDigit(int n){ 27 int tmpSum = 0; 28 while(n > 0){ 29 tmpSum += n %10; 30 n /= 10; 31 } 32 return tmpSum; 33 } 34 bool cmpSort(node a, node b){ 35 if(a.n != b.n) 36 return a.n < b.n; 37 else if(a.a != b.a) 38 return a.a < b.a; 39 } 40 vector<node> dstVec[100]; 41 int fac[11]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}; 42 int main(){ 43 cin >> N; 44 45 int tmpN; 46 for(int i = 1; i <= N; ++ i){ 47 scanf("%d %d", &K, &m); 48 int cnt = 0; 49 printf("Case %d\n", i); 50 for(int j = fac[K]; j < fac[K+1]; j++){ 51 if(getSumOfDigit(j) == m){ 52 tmpN = getSumOfDigit(j+1); 53 int tmpNum = gcd(m, tmpN); 54 if(isPrimeB2(tmpNum)){ 55 cnt ++; 56 dstVec[tmpN].push_back(NODE(tmpN, j)); 57 } 58 } 59 } 60 61 if(cnt == 0) 62 printf("No Solution\n"); 63 else{ 64 for(int k = 1; k < 100; ++ k){ 65 sort(dstVec[k].begin(), dstVec[k].end(), cmpSort); 66 for(auto it = dstVec[k].begin(); it != dstVec[k].end(); ++ it) 67 printf("%d %d\n", it->n, it->a); 68 dstVec[k].clear(); 69 } 70 } 71 } 72 return 0; 73 }
7-2 Merging Linked Lists
这道题目没啥好说的,甲级真题里面有类似的。
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 #include <iostream> 5 #include <map> 6 using namespace std; 7 int L1, L2, N; 8 typedef struct NODE{ 9 int val, next, addr; 10 NODE(){} 11 NODE(int a, int v, int n):addr(a),val(v),next(n){} 12 }node; 13 vector<node> inputNodeVec(1000010); 14 vector<node> node1Vec, node2Vec, dstVec; 15 void adjust(vector<node> &lVec1, vector<node> &lVec2){ 16 int len1 = 0, len2 = lVec2.size()-1, cnt = 0; 17 while(len1 < lVec1.size() && len2 >= 0){ 18 if(cnt < 2){ 19 dstVec.push_back(lVec1[len1++]); 20 cnt ++; 21 } 22 else{ 23 dstVec.push_back(lVec2[len2--]); 24 cnt = 0; 25 } 26 } 27 while(len1 < lVec1.size()) 28 dstVec.push_back(lVec1[len1++]); 29 while(len2 >= 0) 30 dstVec.push_back(lVec2[len2--]); 31 } 32 int main() 33 { 34 cin >> L1 >> L2 >> N; 35 int tmpAddr, tmpNext, tmpVal; 36 while(N--){ 37 scanf("%d %d %d", &tmpAddr, &tmpVal, &tmpNext); 38 inputNodeVec[tmpAddr].next = tmpNext; 39 inputNodeVec[tmpAddr].val = tmpVal; 40 inputNodeVec[tmpAddr].addr = tmpAddr; 41 } 42 int cnt1 = 0, cnt2 = 0; 43 tmpAddr = L1; 44 while(tmpAddr != -1){ 45 node1Vec.push_back(inputNodeVec[tmpAddr]); 46 tmpAddr = inputNodeVec[tmpAddr].next; 47 } 48 tmpAddr = L2; 49 while(tmpAddr != -1){ 50 node2Vec.push_back(inputNodeVec[tmpAddr]); 51 tmpAddr = inputNodeVec[tmpAddr].next; 52 } 53 if(node1Vec.size() > node2Vec.size()){ 54 adjust(node1Vec, node2Vec); 55 } 56 else{ 57 adjust(node2Vec, node1Vec); 58 } 59 int tmpLen = dstVec.size(); 60 for(int i = 0; i < tmpLen; ++ i){ 61 if(i == tmpLen-1) 62 printf("%05d %d -1\n", dstVec[i].addr, dstVec[i].val); 63 else 64 printf("%05d %d %05d\n", dstVec[i].addr, dstVec[i].val, dstVec[i+1].addr); 65 } 66 return 0; 67 }
7-3 Postfix Expression
这一题也是基础题目。
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 #include <iostream> 5 #include <map> 6 #include <string> 7 #include <stack> 8 using namespace std; 9 int L1, L2, N; 10 typedef struct NODE{ 11 string symbolStr; 12 int lChild, rChild; 13 NODE(){} 14 NODE(string str, int v, int n):symbolStr(str),lChild(v),rChild(n){} 15 }node; 16 vector<node> synTreeVec; 17 vector<bool> visitFlagVec; 18 string preStr; 19 string preOrder(int u){ 20 if(u == -1) 21 return ""; 22 string tmpStr1 = preOrder(synTreeVec[u].lChild); 23 string tmpStr2 = preOrder(synTreeVec[u].rChild); 24 if(tmpStr1.empty()) 25 return "(" + synTreeVec[u].symbolStr + tmpStr2 + ")"; 26 else 27 return "(" + tmpStr1 + tmpStr2 + synTreeVec[u].symbolStr + ")"; 28 } 29 bool isSyn(char tmpC){ 30 if(tmpC == '+' || tmpC =='-' || tmpC=='*' || tmpC=='/' || tmpC =='%') 31 return true; 32 return false; 33 } 34 35 int main(){ 36 int N; 37 cin >> N; 38 synTreeVec.resize(N+1); 39 visitFlagVec.resize(N+1, false); 40 string tmpStr; 41 int tmpL, tmpR; 42 for(int i = 1; i <= N; ++ i){ 43 cin >> synTreeVec[i].symbolStr >> tmpL >> tmpR; 44 synTreeVec[i].lChild = tmpL; 45 synTreeVec[i].rChild = tmpR; 46 if(tmpL > 0) 47 visitFlagVec[tmpL] = true; 48 if(tmpR > 0) 49 visitFlagVec[tmpR] = true; 50 } 51 int tmpRoot = 1; 52 for(int i = 1; i <= N; ++ i){ 53 if(!visitFlagVec[i]){ 54 tmpRoot = i; 55 break; 56 } 57 } 58 preStr = preOrder(tmpRoot); 59 cout << preStr; 60 return 0; 61 }
7-4 Dijkstra Sequence
这一题主要是最后的判断。把与源点最短路径相同的点当做同一等级、位置可以互换的点。
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 #include <iostream> 5 #include <map> 6 #include <string> 7 #include <stack> 8 using namespace std; 9 int Nv, Ne; 10 const int INF = 0x7f7f7f7f; 11 typedef struct NODE{ 12 int val, next; 13 NODE(){} 14 NODE(int n, int v):val(v),next(n){} 15 }node; 16 vector<node> routeVec[1010]; 17 vector<int> numSequen,disVec; 18 vector<int> sameLevelNode[1010]; 19 map<int, int> disMap, visFlagMap; 20 bool dijkstra(int u){ 21 fill(disVec.begin(), disVec.end(), INF); 22 vector<bool> dijVisFlagVec(Nv+1,false); 23 disVec[u] = 0; 24 for(int i = 0; i < Nv; ++ i){ 25 int tmpMin = INF, v = -1; 26 for(int j = 1; j <= Nv; j ++ ){ 27 if(!dijVisFlagVec[j] && disVec[j] < tmpMin){ 28 v = j; 29 tmpMin = disVec[j]; 30 } 31 } 32 if(v == -1) 33 break; 34 dijVisFlagVec[v] = true; 35 for(auto it = routeVec[v].begin(); it != routeVec[v].end(); ++ it){ 36 int tmpV = it->next, tmpW = it->val; 37 if(!dijVisFlagVec[tmpV] && disVec[tmpV] > disVec[v] + tmpW) 38 disVec[tmpV] = disVec[v] + tmpW; 39 } 40 } 41 return true; 42 } 43 int main() 44 { 45 cin >> Nv >> Ne; 46 int tmpSt, tmpEnd, tmpDis; 47 while(Ne--){ 48 scanf("%d %d %d", &tmpSt, &tmpEnd, &tmpDis); 49 routeVec[tmpSt].push_back(NODE(tmpEnd, tmpDis)); 50 routeVec[tmpEnd].push_back(NODE(tmpSt, tmpDis)); 51 } 52 int K; 53 disVec.resize(Nv+1, INF); 54 cin >> K; 55 while(K--){ 56 disMap.clear(); 57 visFlagMap.clear(); 58 numSequen.resize(Nv, 0); 59 for(int i = 0; i < Nv; ++ i) 60 scanf("%d", &numSequen[i]); 61 bool tmpFlag = true; 62 dijkstra(numSequen[0]); 63 for(auto i = 1; i <= Nv; ++ i) 64 disMap[disVec[i]] ++; 65 int tmpIndex = 0, tmpMaxIndex = 0, tmpIndexDij = 1; 66 for(auto it = disMap.begin(); it != disMap.end(); ++ it){ 67 tmpMaxIndex += (it->second); 68 tmpDis = it->first; 69 int p = 1; 70 while(p <= Nv && tmpIndexDij <= tmpMaxIndex){ 71 if(disVec[p] == tmpDis){ 72 visFlagMap[p] = 1; 73 tmpIndexDij ++; 74 } 75 p++; 76 77 } 78 while(tmpIndex < tmpMaxIndex){ 79 int tmpNum = numSequen[tmpIndex++]; 80 if(visFlagMap[tmpNum] != 1) 81 tmpFlag = false; 82 else 83 visFlagMap[tmpNum] = 0; 84 } 85 } 86 if(tmpFlag) 87 printf("Yes\n"); 88 else 89 printf("No\n"); 90 } 91 return 0; 92 }
浙公网安备 33010602011771号