PAT-2022年春季考试 - 甲级题解

短命女 2024-03-31 14:00 210阅读 0赞

7-1 Simple Lie Detection

算法标签

模拟

原题

在这里插入图片描述
在这里插入图片描述

思路

依题意模拟即可

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pq priority_queue
  10. #define pb push_back
  11. #define rep(i, a, b) for(int i=a;i<b;++i)
  12. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  13. using namespace std;
  14. typedef pair<int, int> PII;
  15. const int N=10005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  16. const double Exp=1e-8;
  17. //int t, n, m, cnt, ans;
  18. char c[105];
  19. string s;
  20. inline int rd(){
  21. int s=0,w=1;
  22. char ch=getchar();
  23. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  24. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  25. return s*w;
  26. }
  27. int ca(string s){
  28. int res=0;
  29. // 条件1
  30. if(s[0]=='f'){
  31. res-=2;
  32. }
  33. // 条件2
  34. if(s[s.size()-1]=='a'){
  35. res-=1;
  36. }
  37. // 条件3
  38. for(int i=0; i<s.size();){
  39. int j=i+1;
  40. while(j+1<=s.size()&&s[i]==s[j]){
  41. j++;
  42. }
  43. if(j-1-i+1>5){
  44. res+=3;
  45. }
  46. i=j;
  47. }
  48. // 条件4
  49. rep(i, 0, s.size()){
  50. if(i+1<=s.size()&&s[i]=='a'&&(s[i+1]=='e'||s[i+1]=='h')){
  51. res-=4;
  52. }
  53. }
  54. // 条件5
  55. for(int i=0; i<s.size();){
  56. int j=i+1;
  57. while(j+1<=s.size()&&s[j]-'a'-(s[i]-'a')==1){
  58. s[i]=s[j];
  59. j++;
  60. }
  61. if(j-1-i+1>3){
  62. res+=5;
  63. }
  64. i=j;
  65. }
  66. return res;
  67. }
  68. void put(int x) {
  69. if(x<0) putchar('-'),x=-x;
  70. if(x>=10) put(x/10);
  71. putchar(x%10^48);
  72. }
  73. signed main(){
  74. ios::sync_with_stdio(false);
  75. cin.tie(0);
  76. cout.tie(0);
  77. int n, t, m;
  78. scanf("%lld %lld %lld", &n, &t, &m);
  79. rep(i, 0, m){
  80. scanf("%s", c);
  81. s=c;
  82. int res=ca(s);
  83. if(res<=t){
  84. printf("%lld\n", res);
  85. }else{
  86. printf("%lld!!!\n", res);
  87. }
  88. }
  89. return 0;
  90. }

7-2 The First K Largest Numbers 分数 25

原题

在这里插入图片描述

算法标签

排序 优先队列

思路

由于本题时间限制150 ms, 内存限制2 MB, 若直接开辟大小为n的数组依次读入并进行快排, 将会超出内存限制(测试点3 4 5 6 )可以采用优先队列维护前K大的值或是只存前k+1个数并进行排序

优先队列AC代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pq priority_queue
  10. #define pb push_back
  11. #define rep(i, a, b) for(int i=a;i<b;++i)
  12. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  13. using namespace std;
  14. typedef pair<int, int> PII;
  15. const int N=10005, K=10, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  16. const double Exp=1e-8;
  17. //int t, n, m, cnt, ans;
  18. int a[K];
  19. pq<int, vector<int>, greater<int>> q;
  20. inline int rd(){
  21. int s=0,w=1;
  22. char ch=getchar();
  23. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  24. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  25. return s*w;
  26. }
  27. signed main(){
  28. ios::sync_with_stdio(false);
  29. cin.tie(0);
  30. cout.tie(0);
  31. int n=rd(),k=rd();
  32. memset(a, inf, sizeof a);
  33. if(n<k){
  34. n=k;
  35. }
  36. for(int i=0;i<n;++i){
  37. int num=rd();
  38. q.push(num);
  39. if(q.size()>K){
  40. q.pop();
  41. }
  42. }
  43. int p=0;
  44. while (!q.empty()){
  45. a[p++]=q.top();
  46. q.pop();
  47. }
  48. for(int i=p-1, j=0; j<k; i--, j++) {
  49. if(i==p-1){
  50. printf("%lld", a[i]);
  51. }else{
  52. printf(" %lld", a[i]);
  53. }
  54. }
  55. return 0;
  56. }

只存储前K个值进行排序

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pq priority_queue
  10. #define pb push_back
  11. #define rep(i, a, b) for(int i=a;i<b;++i)
  12. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  13. using namespace std;
  14. typedef pair<int, int> PII;
  15. const int N=10005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  16. const double Exp=1e-8;
  17. int a[100];
  18. inline int rd() {
  19. int s=0,w=1;
  20. char ch=getchar();
  21. while(ch<'0'||ch>'9') {
  22. if(ch=='-')w=-1;
  23. ch=getchar();
  24. }
  25. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  26. return s*w;
  27. }
  28. void put(int x) {
  29. if(x<0) putchar('-'),x=-x;
  30. if(x>=10) put(x/10);
  31. putchar(x%10^48);
  32. }
  33. bool cmp(int n1,int n2){
  34. return n1>n2;
  35. }
  36. signed main(){
  37. ios::sync_with_stdio(false);
  38. cin.tie(0);
  39. cout.tie(0);
  40. int n=rd(), k=rd();
  41. rep(i, 0, n){
  42. int t=min(i, k);
  43. a[t]=rd();
  44. sort(a,a+t,cmp);
  45. }
  46. rep(i, 0, min(n, k)){
  47. if(!i){
  48. printf("%lld",a[i]);
  49. }
  50. else{
  51. printf(" %d",a[i]);
  52. }
  53. }
  54. return 0;
  55. }

7-3 Is It A Binary Search Tree - Again分数 25

原题

在这里插入图片描述
在这里插入图片描述

算法标签

树 dfs

思路

读入数据, 对树进行中序遍历,若中序遍历序列有序, 即为二叉搜索树, 依题意对树的中序遍历结果输出

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pq priority_queue
  10. #define pb push_back
  11. #define rep(i, a, b) for(int i=a;i<b;++i)
  12. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  13. using namespace std;
  14. typedef pair<int, int> PII;
  15. const int N=10005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  16. const double Exp=1e-8;
  17. //int t, n, m, cnt, ans;
  18. int n;
  19. int w[N];
  20. vector<int> v;
  21. inline int rd(){
  22. int s=0,w=1;
  23. char ch=getchar();
  24. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  25. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  26. return s*w;
  27. }
  28. void put(int x) {
  29. if(x<0) putchar('-'),x=-x;
  30. if(x>=10) put(x/10);
  31. putchar(x%10^48);
  32. }
  33. void dfs(int u){
  34. if(u>n){
  35. return ;
  36. }
  37. if(u*2<=n){
  38. dfs(u*2);
  39. }
  40. if(w[u]!=-1){
  41. v.pb(w[u]);
  42. }
  43. if(u*2+1<=n){
  44. dfs(u*2+1);
  45. }
  46. }
  47. signed main(){
  48. ios::sync_with_stdio(false);
  49. cin.tie(0);
  50. cout.tie(0);
  51. n=rd();
  52. rep(i, 1, n+1){
  53. w[i]=rd();
  54. }
  55. dfs(1);
  56. bool flag=true;
  57. rep(i, 0, v.size()-1){
  58. if(v[i+1]<v[i]){
  59. flag=false;
  60. break;
  61. }
  62. }
  63. if(flag){
  64. puts("YES");
  65. }else{
  66. puts("NO");
  67. }
  68. printf("%lld", v[0]);
  69. rep(i, 1, v.size()){
  70. printf(" %lld", v[i]);
  71. }
  72. return 0;
  73. }

7-4 The Rescue 分数 30

原题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,210人围观)

还没有评论,来说两句吧...

相关阅读

    相关 20207月春季PAT题解

    99分,最后一题最后一个点没过。 这次实在太坑了,考到还剩50分钟时被通知第二机位的小程序挂了,是小程序直接闪退了,就只能提前交卷了。交卷后做了十几分钟把最后一题做了出来,