涉及考试:计算机学会编程能力等级认证(GESP) 活动内容:提供不同等级的真题供小朋友们选择练习 备考建议:根据自己备考的等级选择相应题目 附加价值:可作为白名单比赛的备考训练 本月打卡:本月打卡题目
【提交】
http://noi.openjudge.cn/ch0103/02/
【描述】
给定3个整数、、,计算表达式的值。
【输入】
输入仅一行,包括三个整数、、, 数与数之间以一个空格分开。。
【输出】
输出一行,即表达式的值。
【样例输入】
2 3 5【样例输出】
25【参考程序】
C语言版本
/** 02:计算(a+b)*c的值* http://noi.openjudge.cn/ch0103/02/*/# include<cstdio>intmain(){int a, b, c;scanf("%d%d%d", &a, &b, &c);printf("%d", (a + b) * c);return0;}C++语言版本
/** 02:计算(a+b)*c的值* http://noi.openjudge.cn/ch0103/02/*/#include<iostream>usingnamespacestd;intmain(){int a, b, c;cin >> a >> b >> c;cout << (a + b) * c;return0;}【提交】
https://www.luogu.com.cn/problem/B4065
【问题描述】
小杨有 个正整数,小杨想知道这些正整数的数位和中最大值是多少。
“数位和”指的是一个数字中所有数位的和。
例如:
对于数字 ,它的各个数位分别是 , , , , 。将这些数位相加,得到:
因此, 的数位和是 。
【输入描述】
第一行包含一个正整数 ,代表正整数个数。
之后 行,每行包含一个正整数。
【输出描述】
输出这些正整数的数位和的最大值。
【样例输入1】
3168110【样例输出1】
9【数据范围】
对于全部数据,保证有 ,每个正整数不超过 。
参考答案:
/** [GESP202412 二级] 数位和* https://www.luogu.com.cn/problem/B4065*/# include<iostream>using namespace std;intmain(){int n, max_ = 0;cin >> n;for (int i = 0;i < n;i++) {long long x;cin >> x;int sum = 0;while (x > 0) { sum += x % 10; x = x / 10; }if (sum > max_) { max_ = sum; } }cout << max_;return 0;}【提交】
http://noi.openjudge.cn/ch0107/03/
【描述】
为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。
现比对两条长度相同的DNA序列。首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。
【输入】
有三行,第一行是用来判定出两条DNA序列是否相关的阈值,随后2行是两条DNA序列(长度不大于500)。
【输出】
若两条DNA序列相关,则输出“yes”,否则输出“no”。
【样例输入】
0.85ATCGCCGTAAGTAACGGTTTTAAATAGGCCATCGCCGGAAGTAACGGTCTTAAATAGGCC【样例输出】
yes【参考程序】
C++版本
/** 03:基因相关性* http://noi.openjudge.cn/ch0107/03/*/#include<iostream>#include<string>using namespace std;intmain(){double e; string str1, str2;cin >> e >> str1 >> str2; int len = str1.size();int count = 0;// 字符串遍历,记录对应位置相同的字符个数for (int i = 0; i < len; i++) {if (str1[i] == str2[i]) { count += 1; } }if ((1.0*count)/ len >= e) {cout << "yes"; }else {cout << "no"; }return 0;}【提交】
https://www.luogu.com.cn/problem/B4263
【问题描述】
小杨有一大片荒地,可以表示为一个 行 列的网格图。
小杨想要开垦这块荒地,但荒地中一些位置存在杂物,对于一块不存在杂物的荒地,该荒地可以开垦当且仅当其上下左右四个方向相邻的格子均不存在杂物。
小杨可以选择至多一个位置,清除该位置的杂物,移除杂物后该位置变为荒地。小杨想知道在清除至多一个位置的杂物的情况下,最多能够开垦多少块荒地。
【输入描述】
第一行包含两个正整数 ,含义如题面所示。
之后 行,每行包含一个长度为 且仅包含字符 . 和 # 的字符串。如果为 .,代表该位置为荒地,如果为 #,代表该位置为杂物。
【输出描述】
输出一个整数,代表在清除至多一个位置的杂物的情况下,最多能够开垦的荒地块数。
【样例输入1】
3 5......#..#.....【样例输出1】
11【样例解释】
移除第二行从左数第二块空地的杂物后:
.........#.....第一行从左数前 块荒地,第二行从左数前 块荒地,第三行从左数前 块荒地,均可开垦,。
【数据范围】
对于全部数据,保证有 。
参考答案:
/** [GESP202503 四级] 荒地开垦* https://www.luogu.com.cn/problem/B4263*/# include<iostream>using namespace std;char arr[1005][1005];int n, m;intcheck(int i, int j){if (i<1 || i>n || j<1 || j>m)return 0;if (arr[i][j] == '.') {if (arr[i - 1][j] != '#' && arr[i + 1][j] != '#' && arr[i][j - 1] != '#' && arr[i][j + 1] != '#') {return 1; } }return 0;}intmain(){cin >> n >> m;for (int i = 1;i <= n;i++) {for (int j = 1;j <= m;j++) {cin >> arr[i][j]; } }int cnt = 0;//表示可开垦荒地的数量int max_ = 0;//增加荒地的最大值for (int i = 1;i <= n;i++) {for (int j = 1;j <= m;j++) {if (arr[i][j] == '.') { cnt += check(i, j); }else { arr[i][j] = '.';int temp = check(i, j); temp += check(i - 1, j); temp += check(i + 1, j); temp += check(i, j - 1); temp += check(i, j + 1);if (temp > max_) { max_ = temp; } arr[i][j] = '#'; } } }cout << cnt + max_;return 0;}【提交】
http://noi.openjudge.cn/ch0109/05/
【描述】
输出一个整数序列中最大的数和最小的数的差。
【输入】
第一行为 ,表示整数个数,整数个数不会大于10000;
第二行为 个整数,以空格隔开,每个整数的绝对值不会大于10000。
【输出】
输出 个数中最大值和最小值的差。
【样例输入】
52 5 7 4 2【样例输出】
5参考程序
/** 05:最大值和最小值的差* http://noi.openjudge.cn/ch0109/05/*/#include<iostream>using namespace std;intmain(){int max = -1e20, min = 1e20;int m;cin >> m;for (int i = 0;i < m;i++) {int x;cin >> x;if (x > max) { max = x; }if (x < min) { min = x; } }cout << max - min;return 0;}【提交】
https://www.luogu.com.cn/problem/B3873
【问题描述】
小杨来到了一家商店,打算购买一些饮料。这家商店总共出售 种饮料,编号从 至 ,其中编号为 的饮料售价 元,容量 毫升。
小杨的需求有如下几点:
小杨想要尽可能尝试不同种类的饮料,因此他希望每种饮料至多购买 瓶;
小杨很渴,所以他想要购买总容量不低于 的饮料;
小杨勤俭节约,所以在 和 的前提下,他希望使用尽可能少的费用。
方便起见,你只需要输出最少花费的费用即可。特别地,如果不能满足小杨的要求,则输出 no solution。
【输入描述】
第一行两个整数 。
接下来 行,依次描述第 种饮料:每行两个整数 。
【输出描述】
输出一行一个整数,表示最少需要花费多少钱,才能满足小杨的要求。特别地,如果不能满足要求,则输出 no solution。
【样例输入1】
5 100100 20002 504 405 303 20【样例输出1】
9【样例1解释】
小杨可以购买 号饮料,总计获得 毫升饮料,花费 元。
如果只考虑前两项需求,小杨也可以购买 号饮料,它们的容量总和为 毫升,恰好可以满足需求。但遗憾的是,这个方案需要花费 元。
【样例输入2】
5 141100 20002 504 405 303 20【样例输出2】
100【样例2解释】
号饮料总计 毫升,如每种饮料至多购买 瓶,则恰好无法满足需求,因此只能花费 元购买 号饮料。
【样例输入3】
4 1412 504 405 303 20【样例输出3】
no solution【数据规模】
对于 的测试点,保证 。
对于 的测试点,保证 。
对于 的测试点,保证 。
参考答案:
/** [GESP202309 六级] 小杨买饮料* https://www.luogu.com.cn/problem/B3873*/#include<iostream>#include<vector>#include<algorithm>#include<climits>using namespace std;intmain(){// 输入饮料种类数N和所需最小容量Lint N, L;cin >> N >> L;// 存储每种饮料的价格和容量,从索引1开始vector<int> c(N + 1), l(N + 1);for (int i = 1; i <= N; ++i) {cin >> c[i] >> l[i]; }// 初始化二维动态规划数组// dp[i][j]表示前i种饮料中总容量至少为j时的最小费用const int INF = INT_MAX / 2;vector<vector<int>> dp(N + 1, vector<int>(L + 1, INF));// 动态规划填表for (int i = 1; i <= N; ++i) {for (int j = 1; j <= L; ++j) {// 不选第i种饮料 dp[i][j] = dp[i - 1][j];// 选第i种饮料if (j - l[i] <= 0) {// 当前饮料容量已满足剩余需求 dp[i][j] = min(dp[i][j], c[i]); }else { dp[i][j] = min(dp[i][j], dp[i - 1][j - l[i]] + c[i]); } } }// 输出结果if (dp[N][L] == INF) {cout << "no solution" << endl; }else {cout << dp[N][L] << endl; }return 0;}青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
