当前位置:首页>java>【第36期】21天养成编程习惯:C++刷题第10天

【第36期】21天养成编程习惯:C++刷题第10天

  • 2026-10-12 00:35:31
【第36期】21天养成编程习惯:C++刷题第10天

跟老马一起“升级打怪”学编程!

  • 涉及考试:计算机学会编程能力等级认证(GESP)
  • 活动内容:提供不同等级的真题供小朋友们选择练习
  • 备考建议:根据自己备考的等级选择相应题目
  • 附加价值:可作为白名单比赛的备考训练
  • 本月打卡:本月打卡题目

Day10:Openjudge1.4.19_简单计算器

【提交】

http://noi.openjudge.cn/ch0104/19/

【描述】

一个最简单的计算器,支持+, -, *, / 四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不会超过int表示的范围。

【输入】

输入只有一行,共有三个参数,其中第1、2个参数为整数,第3个参数为操作符(+,-,*,/)。

【输出】

输出只有一行,一个整数,为运算结果。然而:

(1)如果出现除数为0的情况,则输出:Divided by zero!

(2)如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!

【样例输入】

1 2 +

【样例输出】

3

【提示】

可以考虑使用if和switch结构。

【参考程序】

C语言版本

/** 19:简单计算器* http://noi.openjudge.cn/ch0104/19/*/#include<cstdio>intmain(){int a, b;char c;scanf("%d %d %c", &a, &b, &c);switch (c)    {case'+':printf("%d", a + b);break;case'-':        printf("%d", a - b);        break;    case'*':        printf("%d", a * b);        break;    case'/':        if (b == 0)        {            printf("Divided by zero!");        }        else        {            printf("%d", a / b);        }        break;    default:        printf("Invalid operator!");        break;    }    return 0;}

C++语言版本

/** 19:简单计算器* http://noi.openjudge.cn/ch0104/19/*/#include<iostream>using namespace std;intmain(){int a,b;char c;cin >> a >> b;cin >> c;switch (c)    {case'+':cout << a + b;break;case'-':        cout << a - b;        break;    case'*':        cout << a * b;        break;    case'/':        if (b == 0)        {            cout << "Divided by zero!";        }        else        {            cout << a / b;        }        break;    default:        cout << "Invalid operator!";        break;    }    return 0;}

Day10:GESP二级2025.06_幂和数

【提交】

https://www.luogu.com.cn/problem/B4357

【问题描述】

对于正整数 ,如果  可以表为两个  的次幂之和,即 ( 均为非负整数),那么称  为幂和数。

给定正整数 ,请你求出满足  的整数  中有多少个幂和数。

【输入描述】

一行,两个正整数 ,含义如上。

【输出描述】

输出一行,一个整数,表示  之间幂和数的数量。

【样例输入1】

2 8

【样例输出1】

6

【样例输入2】

10 100

【样例输出2】

20

【数据范围】

对于所有测试点,保证 。

参考答案:

/** [GESP202506 二级] 幂和数* https://www.luogu.com.cn/problem/B4357*/#include<iostream>#include<cmath>using namespace std;intmain(){int l, r, cnt = 0;cin >> l >> r;for (int i = l;i <= r;i++)    {// i = 2^x + 2^yfor (int x = 0;pow(2, x) <= i;x++)        {int a = pow(2, x);int b = i - a;for (int y = x;pow(2, y) <= b;y++)            {if (pow(2, y) == b)                    cnt++;            }        }    }cout << cnt << endl;return 0;}

Day10:Openjudge1.6.06_校门外的树

【提交】

http://noi.openjudge.cn/ch0106/06/

【描述】

某校大门外长度为的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在的位置;数轴上的每个整数点,即,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

【输入】

第一行有两个整数和 (),代表马路的长度,代表区域的数目,和之间用一个空格隔开。接下来的行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

对于20%的数据,区域之间没有重合的部分;

对于其它的数据,区域之间有重合的情况。

【输出】

包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

【样例输入】

500 3150 300100 200470 471

【样例输出】

298

【来源】

NOIP2005复赛 普及组 第二题

【参考程序】

C语言版本

/** 06:校门外的树* http://noi.openjudge.cn/ch0106/06/*/# include<cstdio>intmain(){int t[10005] = { 0 };int L, M, a, b, cnt = 0;scanf("%d%d", &L, &M);for (int i = 0; i <= L; i++)    {        t[i] = 1;    }for (int i = 0; i < M; i++)    {scanf("%d%d", &a, &b);for (int j = a; j <= b; j++)        {            t[j] = 0;        }    }for (int i = 0; i <= L; i++)    {        cnt += t[i];    }printf("%d", cnt);return 0;}

C++版本

/** 06:校门外的树* http://noi.openjudge.cn/ch0106/06/*/# include<iostream>using namespace std;intmain(){int t[10005] = { 0 };int L,M,a,b,cnt=0;cin >> L >> M;for (int i = 0; i <= L; i++)    {        t[i] = 1;    }for (int i = 0; i < M; i++)    {cin >> a >> b;for (int j = a; j <= b; j++)        {            t[j] = 0;        }    }for (int i = 0; i <= L; i++)    {        cnt += t[i];    }cout << cnt;return 0;}

Day10:GESP四级2025.09_排兵布阵

【提交】

https://www.luogu.com.cn/problem/B4415

【问题描述】

作为将军,你自然需要合理地排兵布阵。地图可以视为  行  列的网格,适合排兵的网格以 1 标注,不适合排兵的网格以 0 标注。现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?

【输入描述】

第一行,两个正整数 ,分别表示地图网格的行数与列数。

接下来  行,每行  个整数 ,表示各行中的网格是否适合排兵。

【输出描述】

一行,一个整数,表示适合排兵的矩形区域包含的最大网格数。

【样例输入1】

4 30 1 11 0 10 1 11 1 1

【样例输出1】

4

【样例输入2】

3 51 0 1 0 10 1 0 1 00 1 1 1 0

【样例输出2】

3

【数据范围】

对于所有测试点,保证 ,。

参考答案:

/** [GESP202509 四级] 排兵布阵* https://www.luogu.com.cn/problem/B4415*/# include<iostream># include<algorithm>using namespace std;int arr[15][15];// 存储网格int n, m;intcheck(int x1, int y1,int x2,int y2){// 检查矩形 (x1,y1) 到 (x2,y2) 是否全为1int cnt = 0;for (int i = x1; i <= x2; i++)    {for (int j = y1; j <= y2; j++)        {if (arr[i][j] != 1)            {return0;            }else            {                cnt += 1;            }        }    }return cnt;}intmain(){cin >> n >> m;// 读入网格数据for (int i = 0; i < n; i++)    {for (int j = 0; j < m; j++)        {cin >> arr[i][j];        }    }int ans = 0;// 记录最大面积// 枚举矩形左上角 (i, j)for (int i = 0; i < n; i++)    {for (int j = 0; j < m; j++)        {// 枚举矩形右下角 (p, q)for (int p = i; p < n; p++)            {for (int q = j; q < m; q++)                {                    ans = max(ans, check(i, j, p, q));                }            }        }    }cout << ans << endl;return 0;}

Day10:Openjudge1.9.07_不与最大数相同的数字之和

【提交】

http://noi.openjudge.cn/ch0109/07/

【描述】

输出一个整数数列中不与最大数相同的数字之和。

【输入】

输入分为两行:

第一行为 (为接下来数的个数,);

第二行为个整数,数与数之间以一个空格分开,每个整数的范围是-1000,000到1000,000。

【输出】

输出为个数中除去最大数其余数字之和。

【样例输入】

31 2 3

【样例输出】

3

参考程序

/** 07:不与最大数相同的数字之和* http://noi.openjudge.cn/ch0109/07/*/#include<iostream>using namespace std;const int N = 105;int arr[N];intmain(){int n, max = -1000000, total = 0;cin >> n;for (int i = 0;i < n;i++)    {cin >> arr[i];if (arr[i] > max)        {            max = arr[i];        }    }for (int i = 0;i < n;i++)    {if (arr[i] != max)        {            total += arr[i];        }    }cout << total;return 0;}

Day10:GESP六级2023.12_闯关游戏

【提交】

https://www.luogu.com.cn/problem/P10108

【问题描述】

你来到了一个闯关游戏。

这个游戏总共有  关,每关都有  个通道,你需要选择一个通道并通往后续关卡。其中,第  个通道可以让你前进  关,也就是说,如果你现在在第  关,那么选择第  个通道后,你将直接来到第  关(特别地,如果 ,那么你就通关了)。此外,当你顺利离开第  关时,你还将获得  分。

游戏开始时,你在第  关。请问,你通关时最多能获得多少总分。

【输入描述】

第一行两个整数 ,,分别表示关卡数量和每关的通道数量。

接下来一行  个用单个空格隔开的整数 。保证 。

接下来一行  个用单个空格隔开的整数 。保证 。

【输出描述】

一行一个整数,表示你通关时最多能够获得的分数。

【样例输入1】

6 2 2 31 0 30 100 30 30

【样例输出1】

131

【样例解释1】

你可以在第  关选择第  个通道,获得  分并来到第  关;随后再选择第  个通道,获得  分并来到第  关;最后任选一个通道,都可以获得  分并通关。如此,总得分为 。

【样例输入2】

6 22 31 0 30 100 30 -1

【样例输出2】

101

【样例解释2】

请注意,一些关卡的得分可能是负数。

【数据范围】

对于  的测试点,保证 。

对于  的测试点,保证 ;保证 。

对于所有测试点,保证 ;保证 。

参考答案:

/**  [GESP202312 六级] 闯关游戏* https://www.luogu.com.cn/problem/P11960*/# include<iostream># include<algorithm># include<vector># include<climits>using namespace std;const int N = 1e4 + 5;const int M = 100 + 5;int n, m, maxs = 0,ans = INT_MIN;vector<int> a(M); // 每个通道前进的关数vector<int> b(N); //离开每一关的得分vector<int> dp(N, INT_MIN);intmain(){cin >> n >> m;for (int i = 1;i <= m;i++)    {cin >> a[i];        maxs = max(maxs, a[i]);    }for (int i = 1;i <= n;i++)    {cin >> b[i];    }    dp[1] = b[1];    for (int i = 1;i <= n;i++)    {for (int j = 1;j <= m;j++)        {if (i - a[j] > 0)            {                dp[i] = max(dp[i], dp[i - a[j]] + b[i]);            }        }    }for (int i = n - maxs + 1;i <= n;i++)        ans = max(ans, dp[i]);cout << ans;return 0;}

青少年编程竞赛交流

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。

最新文章

随机文章