当前位置:   article > 正文

ZISUOJ 2023-2024学年第一学期《高级语言程序设计》期末试题(20240122)_oj高级语言程序设计

oj高级语言程序设计

说明:

        早上考完C语言,趁着做题环境还在,赶紧复现写一下题解和思路。对于我个人来说,这次考试发挥中规中矩吧,如果考试的时候冷静一点,可能错的次数会少一点,最后一题知道是用贪心做,但是当时没写出来,挺可惜的。

排名:

根据老师说的,期末成绩只根据做出题目的数量来给赋分,那我也算是年级段并列第一吧。

题目列表:

问题 A: Simple Calculator 

思路:

        当时直接看的输入输出写的答案,压根没看题目,猜到了分别是输出a+b,a-b,a*b,直接写即可。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. //const int N = 1e4+5;
  6. int main(){
  7. //问题 A: Simple Calculator
  8. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  9. int a,b;cin >> a >> b;
  10. cout << a+b << '\n';
  11. cout << a-b << '\n';
  12. cout << a*b << '\n';
  13. return 0;
  14. }

问题 B: Segmented Linear Function

思路:

        之前写过的原题,用if判断一下x即可,然后根据不同情况进行输出。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. //const int N = 1e4+5;
  6. int main(){
  7. //问题 B: Segmented Linear Function
  8. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  9. int x;cin >> x;
  10. if(x<1) cout << x;
  11. else if(x<10) cout << 2*x-1;
  12. else cout << 3*x-11;
  13. return 0;
  14. }

问题 C: Scholarship 

思路:

        此题重点在于读懂题目的(1)、(2)、(3)的判断,注意不要漏掉两个数都小于90输出0的情况。写if判断然后输出即可。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. //const int N = 1e4+5;
  6. int main(){
  7. //问题 C: Scholarship
  8. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  9. int a,b;cin >> a >> b;
  10. int minn = min(a,b);
  11. int maxn = max(a,b);
  12. if(minn>=95) cout << 500;
  13. else if(minn>=90&&maxn>=95) cout << 200;
  14. else if(minn>=90)cout << 100;
  15. else cout << 0;
  16. return 0;
  17. }

问题 D: Acceleration of a Spaceship

 思路:

        根据题意模拟一下即可,注意设置初始值为8。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. //const int N = 1e4+5;
  6. int main(){
  7. //问题 D: Acceleration of a Spaceship
  8. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  9. int n;cin >> n;
  10. int ans = 0;
  11. int beginnum = 8;
  12. for(int i = 1;i<=n;i++){
  13. if(i==1) ans = beginnum*(i+1);
  14. else ans*=(i+1);
  15. }
  16. cout << ans;
  17. return 0;
  18. }

问题 E: Mean Score and Maximum Score Difference

 思路:

        读题知道题目要求我们输出n个数的平均值和n个数中最大的差值。平均值的计算通过一个double类型的变量来累加所有数,最后输出的时候再除以n即可。而n个数的最大差值通过找到这些数中的最大值和最小值然后作差输出即可,当然,找最大最小值就通过最常用的打擂台的方式找即可。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. const int N = 1e2+5;
  6. int a[N];
  7. int main(){
  8. //问题 E: Mean Score and Maximum Score Difference
  9. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  10. int n;cin >> n;
  11. for(int i = 1;i<=n;i++) cin >> a[i];
  12. int maxn = INT_MIN;
  13. int minn = INT_MAX;
  14. double ans = 0;
  15. for(int i = 1;i<=n;i++){
  16. if(a[i]>maxn) maxn = a[i];
  17. if(a[i]<minn) minn = a[i];
  18. ans+=a[i];
  19. }
  20. cout << fixed << setprecision(2) << ans/n << '\n';
  21. cout << maxn-minn << '\n';
  22. return 0;
  23. }

问题 F: Draw a House

思路:

        很经典的题,考察的二重循环,最重要的是确认每个循环的次数和跳出循环的条件。确认好后按输出的格式输出即可。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. const int N = 1e2+5;
  6. int a[N];
  7. int main(){
  8. //问题 F: Draw a House
  9. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  10. int n;cin >> n;
  11. for(int i = 1;i<=n-1;i++){
  12. for(int j = 1;j<=n-i;j++) cout << ' ';
  13. for(int j = 1;j<=2*i-1;j++) cout << '*';
  14. cout << '\n';
  15. }
  16. for(int i = 1;i<=n;i++){
  17. for(int j = 1;j<=2*n-1;j++) cout << '*';
  18. cout << '\n';
  19. }
  20. return 0;
  21. }

问题 G: String Abbreviation

 

思路:

        读进char s[]数组中,或者使用string接收,然后模拟遍历,如果是连续的,先输出首个字符,遇到中间的字符则不输出,到了不连续的位置,则输出'-'和截止字符,我这里下面的写法需要考虑最后一个字符的状态,所以加了一个if判断。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. const int N = 1e2+5;
  6. //int a[N];
  7. //string s;
  8. char s[N];
  9. int main(){
  10. //问题 G: String Abbreviation
  11. // ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  12. cin >> s;
  13. int len = strlen(s);
  14. int type = 0;
  15. char beginc;
  16. int i;
  17. for(i = 0;i<len-1;i++){
  18. if(s[i+1]==s[i]+1&&type == 0){
  19. beginc = s[i];
  20. type = 1;
  21. }else if(s[i+1]!=s[i]+1&&type==1){
  22. printf("%c-%c",beginc,s[i]);
  23. type = 0;
  24. }else if(type==0) printf("%c",s[i]);
  25. }
  26. if(type == 1) printf("%c-%c",beginc,s[i]);
  27. else printf("%c",s[len-1]);
  28. return 0;
  29. }

问题 H: Substring Statistics

思路:

        读代码知道考察的是指针。知道ptr是出现子串的第一个字符的相对下标,ans是子串出现的次数。因为src是char类型的指针,所以第一个选项选A,用于动态分配其内存。其他都是基本题。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. int main(){
  6. //问题 H: Substring Statistics
  7. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  8. cout << "A\n";
  9. cout << "B\n";
  10. cout << "A\n";
  11. cout << "A\n";
  12. cout << "D\n";
  13. cout << "D\n";
  14. return 0;
  15. }

 问题 I: Joe's Toy Store

思路:

        之前有写过类似的题。写一个结构体,然后通过两个字符串的字典序排序,排序好然后统计好数字并按照要求输出即可。这个题用map也可以更快地做出来。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. const int N = 1e2+5;
  6. struct node{
  7. string s1;
  8. string s2;
  9. int num;
  10. }a[N];
  11. bool cmp(node a1,node a2){
  12. if(a1.s2!=a2.s2) return a1.s2<a2.s2;
  13. else return a1.s1<a2.s1;
  14. }
  15. int main(){
  16. //问题 I: Joe's Toy Store
  17. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  18. int n;cin >> n;
  19. while(n--){
  20. int m;cin >> m;
  21. for(int i = 1;i<=m;i++) cin >> a[i].s1 >> a[i].s2 >> a[i].num;
  22. sort(a+1,a+1+m,cmp);
  23. int ans;
  24. int i = 1,j;
  25. int type = 0;
  26. while(i<=m){
  27. if(type==0){
  28. cout << a[i].s2 << '\n';
  29. type = 1;
  30. }
  31. ans = a[i].num;
  32. for(j = i+1;a[j].s1==a[j-1].s1&&a[j].s2==a[j-1].s2;j++) ans+=a[j].num;
  33. cout << " |----" << a[i].s1 << '(' << ans << ")\n";
  34. i = j;
  35. if(a[i].s2!=a[i-1].s2) type = 0;
  36. }
  37. cout << '\n';
  38. }
  39. return 0;
  40. }

问题 J: Win a Prize

思路:

        主要思想还是贪心,读入数据后,对结构体数组根据reward从大到小排序,然后遍历0~n-1,根据limit限制使用贪心先把能完成的mini-game先完成掉并对ans累加对应的reward,最后输出ans即可。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //using ll = long long;
  4. //using PII = pair<int,int>;
  5. const int N = 5e2+5;
  6. int n = 0;
  7. struct tinygame{
  8. int T,R;
  9. }games[N];
  10. bool arrange[N];
  11. bool cmp(tinygame games1,tinygame games2){
  12. return games1.R>games2.R;
  13. }
  14. int main(){
  15. //问题 J: Win a Prize
  16. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  17. cin >> n;
  18. for(int i = 0;i<n;i++) arrange[i] = false;
  19. for(int i = 0;i<n;i++) cin >> games[i].T;
  20. for(int i = 0;i<n;i++) cin >> games[i].R;
  21. sort(games,games+n,cmp);
  22. int ans = 0;
  23. for(int i = 0;i<n;i++){
  24. for(int t = games[i].T-1;t>=0;t--){
  25. if(!arrange[t]){
  26. arrange[t] = true;
  27. ans+=games[i].R;
  28. break;
  29. }
  30. }
  31. }
  32. cout << ans << '\n';
  33. return 0;
  34. }
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/426285
推荐阅读
相关标签
  

闽ICP备14008679号