涉及考试:计算机学会编程能力等级认证(GESP) 活动内容:提供不同等级的真题供小朋友们选择练习 备考建议:根据自己备考的等级选择相应题目 附加价值:可作为白名单比赛的备考训练 本月打卡:本月打卡题目
【提交】
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;}【提交】
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;}【提交】
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;}【提交】
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;}【提交】
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;}【提交】
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天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
