当前位置:   article > 正文

2024C++信息素养大赛-算法创意实践挑战_复赛真题(广东省)题目+参考答案和详细解析

2024C++信息素养大赛-算法创意实践挑战_复赛真题(广东省)题目+参考答案和详细解析

第一题:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a,b;
  4. int main(){
  5. scanf("%d%d",&a,&b);
  6. printf("%d",a*b);
  7. return 0;
  8. }

 第二题:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a,b,c;
  4. int main(){
  5. scanf("%d%d%d",&a,&b,&c);
  6. if(a==b&&b==c) printf("Equilateral glass");
  7. else if(a==b || b==c || c==a) printf("Isosceles glass");
  8. else if(a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a) printf("Right angle glass");
  9. else printf("None");
  10. return 0;
  11. }

第三题:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int a[1010][1010];
  5. int main(){
  6. scanf("%d",&n);
  7. vector<int> res;
  8. for(int i=1;i<=n;i++){
  9. char flag;
  10. int x,y,k;
  11. cin>>flag;
  12. if(flag=='M'){
  13. scanf("%d%d%d",&x,&y,&k);
  14. a[x][y]=k;
  15. }
  16. else if(flag=='N')
  17. {
  18. scanf("%d%d",&x,&y);
  19. res.push_back(a[x][y]);
  20. }
  21. }
  22. for(int i : res){
  23. printf("%d\n",i);
  24. }
  25. return 0;
  26. }

第四题:

计算在一个 n×m 的矩形中可以放置的所有可能的正方形的数量,除了逐个遍历每个可能的正方形边长的解法外,还可以通过数学公式进行推导和简化。下面是一些其他可能的解法:

解法一:数学公式推导

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. int main(){
  5. scanf("%d%d",&n,&m);
  6. int min_side=min(n,m);
  7. int ans=0;
  8. for(int k=1;k<=min_side;k++){
  9. ans+=(n-k+1)*(m-k+1);
  10. }
  11. printf("%d",ans);
  12. return 0;
  13. }

 

解法二:累积面积法

  1. int total_squares = 0;
  2. for (int i = 1; i <= n; ++i) {
  3. for (int j = 1; j <= m; ++j) {
  4. int max_square_size = min(n - i + 1, m - j + 1);
  5. total_squares += max_square_size;
  6. }
  7. }

解法三:动态规划法

  1. vector<vector<int>> dp(n, vector<int>(m, 0));
  2. int total_squares = 0;
  3. for (int i = 0; i < n; ++i) {
  4. for (int j = 0; j < m; ++j) {
  5. if (grid[i][j] == 1) {
  6. if (i == 0 || j == 0) {
  7. dp[i][j] = 1;
  8. } else {
  9. dp[i][j] = 1 + min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]});
  10. }
  11. total_squares += dp[i][j];
  12. }
  13. }
  14. }

 解法四:递归与记忆化搜索

第五题:

 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. string str;
  5. int main(){
  6. cin>>n;
  7. cin>>str;
  8. for(int i=1;i<=n;i++){
  9. char ch;
  10. string str_1;
  11. cin>>ch;
  12. if(ch=='F') {
  13. cin>>str_1;
  14. str=str_1+str;
  15. }
  16. else if(ch=='B'){
  17. cin>>str_1;
  18. str=str+str_1;
  19. }
  20. else if(ch=='R'){
  21. reverse(str.begin(),str.end());
  22. }
  23. }
  24. cout<<str;
  25. return 0;
  26. }

第六题:

【题目描述】

花果山上有一只猴子,每天都去蟠桃园摘桃子。第一天,猴子只摘了一个桃子:之后两天(第二天和第三天),最子每天都摘两个桃子,之后三天(第四、五、六天),猴子每天都摘三个桃子,之后四天(第七、八、九、十天),猴子每天都四个桃子.…这种模式会一直持续下去,因为蟠桃园里的桃子无穷无尽,请计算在前n天里,猴子一共摘了多少个挑子。

【输入描述】

输入只有一厅,一个正整数n,表示前n天.

【输出描述】

钟出只有一行,一个正整数,表示前n天猴子一共摘了多少个桃子。

【输入】

6

【输出】

14

【提示】

方法一:数学递推法

保证1<=n<= 1000.

解析:

1:第一天:1(1*1)

2:第二天,第三天:2,2(2*2)

3:第四天,第五天,第六天:3,3,3(3*3)

……

x:……第n天:x,x,x……(x*x)

例如输入6(表示6天)

1:第一天:1(1*1)

2:第二天,第三天:2,2(2*2)

3:第四天,第五天,第六天:3,3,3(3*3)

1+2+3=6天;

1*1+2*2+3*3=14个桃;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. long long sum=0;
  5. int main(){
  6. scanf("%d",&n);
  7. for(int i=1,j=1;i<=n;i+=j){
  8. sum+=j*j;
  9. j++;
  10. }
  11. printf("%lld",sum);
  12. }

方法二:

你可以用一个变量来跟踪当前的天数,一个变量来跟踪当前的周期长度,以及一个变量来计算总共摘了多少个桃子。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. long long sum=0;
  5. int main(){
  6. scanf("%d",&n);
  7. int L=1; //表示跟踪当前的周期长度
  8. for(int d=1;d<=n;d++){//d表示天数
  9. for(int i=1;i<=L;i++){
  10. sum+=L;
  11. d++;
  12. }
  13. L++;
  14. }
  15. printf("%lld",sum);
  16. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/821717
推荐阅读