涉及考试:计算机学会编程能力等级认证(GESP) 活动内容:提供不同等级的真题供小朋友们选择练习 备考建议:根据自己备考的等级选择相应题目 附加价值:可作为白名单比赛的备考训练 本月打卡:本月打卡题目
【提交】
https://www.luogu.com.cn/problem/B3863
【问题描述】
开学了,小明来到文具店选购文具。签字笔2元一支,他需要 支;记事本5元一本,他需要 本;直尺3元一把,他需要 把。小明手里有 元钱。请你通过编程帮小明算算,他手里的钱是否够买他需要的文具。
【输入描述】
输入4行。
第一行包含一个正整数,是小明购买签字笔的数量。约定。
第二行包含一个正整数,是小明购买记事本的数量。约定 。
第三行包含一个正整数,是小明购买直尺的数量。约定。
第四行包含一个正整数,是小明手里的钱数(单位:元)。
【输出描述】
输出2行。如果小明手里的钱够买他需要的文具,则第一行输出"Yes",第二行输出小明会剩下的钱数(单位:元); 否则,第一行输出"No",第二行输出小明缺少的钱数(单位:元)。
【样例输入1】
11120【样例输出1】
Yes10【样例输入2】
1115【样例输出2】
No5参考答案:
/** [GESP202309 一级] 买文具* https://www.luogu.com.cn/problem/B3863*/# include<iostream>using namespace std;intmain(){int x = 0, y = 0, z = 0, q = 0;cin >> x >> y >> z >> q;int t = 2 * x + 5 * y + 3 * z;if (t <= q) {cout << "Yes" << endl;cout << q - t; }else {cout << "No" << endl;cout << t - q; }return 0;}【提交】
http://noi.openjudge.cn/ch0105/05/
【描述】
孙老师讲授的《计算概论》这门课期中考试刚刚结束,他想知道考试中取得的最高分数。因为人数比较多,他觉得这件事情交给计算机来做比较方便。你能帮孙老师解决这个问题吗?
【输入】
输入两行,第一行为整数,表示参加这次考试的人数。第二行是这个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为0到100之间的整数。
【输出】
输出一个整数,即最高的成绩。
【样例输入】
585 78 90 99 60【样例输出】
99【参考程序】
C语言版本
/** 05:最高的分数* http://noi.openjudge.cn/ch0105/05/*/#include<cstdio>intmain(){int n, x, max = 0;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &x); max = x > max ? x : max; }printf("%d", max);return 0;}C++版本
/** 05:最高的分数* http://noi.openjudge.cn/ch0105/05/*/# include<iostream>using namespace std;intmain(){int n, x, max = 0;cin >> n;for (int i = 0; i < n; i++) {cin >> x; max = x > max ? x : max; }cout << max;return 0;}【提交】
https://www.luogu.com.cn/problem/B4449
【问题描述】
小杨是学校网络安全小组的成员,今天他的任务是设计一个“密码强度检测器”,帮助同学们检查自己的密码是否足够安全。一个安全的密码需要满足以下条件:
例如:
PAs1s2an 是安全密码(有8位、包含大写字母 P、A 和数字 1、2)。ab1da3cd 不是安全密码(没有大写字母)。Paabdbcd 不是安全密码(没有数字)。Pa2 不是安全密码(只有3位,太短了)。【输入描述】
第一行一个正整数 ,代表数据组数。
对于每组数据,一行包含一个字符串,代表需要安全检测的密码。
【输出描述】
对于每组数据输出一行,如果满足强度要求输出 Y,否则输出 N。
【样例输入1】
6PAs1s2an1a2bCql3Pa12bsnaab1da3cdPaabdbcdPa2【样例输出1】
YYYNNN【样例解释】
PAs1s2an 是安全密码(有8位、包含大写字母 P、A 和数字 1、2)。1a2bCql3 是安全密码(有8位、包含大写字母 C 和数字 1、2、3)。Pa12bsna 是安全密码(有8位、包含大写字母 P 和数字 1、2)。ab1da3cd 不是安全密码(没有大写字母)。Paabdbcd 不是安全密码(没有数字)。Pa2 不是安全密码(只有3位,太短了)。【数据范围】
对于所有测试点,保证 ,并且每组数据密码长度不超过 且至少为 。
参考答案:
/* * [GESP202512 三级] 密码强度 * https://www.luogu.com.cn/problem/B4449 */# include<iostream># include<string>using namespace std;intmain(){int T;cin >> T;for (int i = 0;i < T;i++) {string s;cin >> s;if (s.size() < 8) {cout << "N" << endl;continue; }bool hasUpper = false; // 标记是否有大写字母bool hasDigit = false; // 标记是否有数字for (int j = 0;j < s.size();j++) {if (s[j] >= 'A' && s[j] <= 'Z') { hasUpper = true; }else if (s[j] >= '0' && s[j] <= '9') { hasDigit = true; } }if (hasUpper == true && hasDigit == true) {cout << "Y" << endl; }else {cout << "N" << endl; } }return 0;}【提交】
https://www.luogu.com.cn/problem/B4452
【问题描述】
小 A 有 元预算。商店有 个商品,每个商品有商品名 、价格 和优先级 三种属性,其中 为正整数,且 越小代表商品的优先级越高。
小 A 的购物策略为:
总是优先买优先级最高的东西;
如果有多个最高优先级商品,购买价格最低的;
如果有多个优先级最高且价格最低的商品,购买商品名字典序最小的。
小 A 想知道能购买哪些商品。
【输入描述】
第一行两个正整数 ,代表预算和商品数。
之后 行,每行一个商品,依次为 ,代表第 个商品的商品名、价格、优先级。
数据保证不存在两个名字相同的商品。
【输出描述】
按照字典序从小到大的顺序,输出所有购买商品的商品名。
【样例输入1】
20 4apple 6 8bus 15 1cab 1 10water 4 8【样例输出1】
buscabwater【数据范围】
对于所有测试点,保证 。商品名仅由小写字母组成且不存在两个相同的商品名。
参考答案:
/* * [GESP202512 四级] 优先购买 * https://www.luogu.com.cn/problem/B4452 */# include<iostream># include<algorithm>using namespace std;structItem {string name;int price;int priority;};// 比较函数:先按优先级升序,再按价格升序,再按名字字典序升序boolcmp(const Item a, const Item b){if (a.priority != b.priority) {return a.priority < b.priority; }if (a.price != b.price) {return a.price < b.price; }return a.name < b.name;}intmain(){ Item items[1005];string bought[1005];int M, N;cin >> M >> N;for (int i = 0; i < N; i++) {cin >> items[i].name >> items[i].price >> items[i].priority; } sort(items, items + N, cmp);// 贪心购买int k = 0;for (int i = 0;i < N;i++) {if (items[i].price <= M) { bought[k] = items[i].name; M -= items[i].price; k++; } }// 将购买的商品按字典序排序 sort(bought, bought + k);// 输出结果for (int i = 0;i < k;i++) {cout << bought[i] << endl; }return 0;}【提交】
http://noi.openjudge.cn/ch0111/04/
【描述】
仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑结构连接在一起,即将它们全部连到一个单一的中心服务器。为了组织这个完全公正的比赛,裁判委员会主席提出要将所有选手的电脑等距离地围绕在服务器周围放置。
为购买网线,裁判委员会联系了当地的一个网络解决方案提供商,要求能够提供一定数量的等长网线。裁判委员会希望网线越长越好,这样选手们之间的距离可以尽可能远一些。
该公司的网线主管承接了这个任务。他知道库存中每条网线的长度(精确到厘米),并且只要告诉他所需的网线长度(精确到厘米),他都能够完成对网线的切割工作。但是,这次,所需的网线长度并不知道,这让网线主管不知所措。
你需要编写一个程序,帮助网线主管确定一个最长的网线长度,并且按此长度对库存中的网线进行切割,能够得到指定数量的网线。
【输入】
第一行包含两个整数 和 ,以单个空格隔开。 是库存中的网线数,是需要的网线数量。
接下来 行,每行一个数,为库存中每条网线的长度(单位:米)。所有网线的长度至少1m,至多100km。输入中的所有长度都精确到厘米,即保留到小数点后两位。
【输出】
网线主管能够从库存的网线中切出指定数量的网线的最长长度(单位:米)。必须精确到厘米,即保留到小数点后两位。
若无法得到长度至少为1cm的指定数量的网线,则必须输出“0.00”(不包含引号)。
【样例输入】
4 118.027.434.575.39【样例输出】
2.00【参考程序】
题目问:要找最长的网线长度。对应的模板为:求满足某一条件的最大值。
网线长度需要满足的条件为:将库存中的网线按该长度进行切割,得到的网线数量大于等于居民需要的网线数量。
假设要判断网线长度 是否满足条件,先遍历所有库存中网线长度,每条网线长度记为 ,那么 即为这条库存网线可以切出的成品网线的条数,加和求出总条数。看处理得到的网线总条数是否大于等于居民需要的网线数量 ,如果是,那么满足条件,否则不满足条件。
/** 04:网线主管* http://noi.openjudge.cn/ch0111/04/submit/*/#include<iostream>#include<iomanip>using namespace std;int n, k, a[10005];//a[i]:第i条网线的长度 单位:厘米 boolcheck(int l){//如果需要网线长度为l,最多可以得的网线段数是否大于等于k long long ct = 0;//计数for (int i = 1; i <= n; ++i) ct += a[i] / l;//整除运算return ct >= k;}intmain(){double t;cin >> n >> k;for (int i = 1; i <= n; ++i) {cin >> t; a[i] = int(t * 100);//单位变为厘米 }if (check(1) == false) {//如果切成1厘米一段也不能达到要求的数量,则没有切割方案cout << "0.00";return0; }int l = 1, r = 1e7;while (l <= r)//二分答案求满足条件的最大值 {int m = (l + r) / 2;if (check(m))//如果网线长为m满足条件 l = m + 1;else r = m - 1; }cout << fixed << setprecision(2) << (double)r / 100;//单位转为米return 0;}【提交】
http://noi.openjudge.cn/ch0206/2988/
【描述】
对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:
比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。
给定任意两个字符串,写出一个算法来计算出他们的距离。
【输入】
第一行有一个整数。表示测试数据的组数,接下来共行,每行两个字符串,用空格隔开。表示要计算距离的两个字符串,字符串长度不超过1000。
【输出】
针对每一组测试数据输出一个整数,值为两个字符串的距离。
【样例输入】
3abcdefg abcdefab abmnklj jlknm【样例输出】
104【参考程序】
/** 2988:计算字符串距离* http://noi.openjudge.cn/ch0206/2988/*/# include<iostream># include<vector># include<algorithm>using namespace std;intEditDistance(string& str1, string& str2){int n = str1.length();int m = str2.length();vector<vector<int>> dp(n + 1, vector<int>(m + 1));for (int i = 0; i <= n; i++) { dp[i][0] = i; }for (int j = 0; j <= m; j++) { dp[0][j] = j; }for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (str1[i - 1] == str2[j - 1]) {// 字符相同,无需操作,继承左上角的值 dp[i][j] = dp[i - 1][j - 1]; }else { dp[i][j] = 1 + min( { dp[i - 1][j], // 删除str1[i-1] dp[i][j - 1], // 在str1插入str2[j-1] dp[i - 1][j - 1] // 替换str1[i-1]为str2[j-1] }); } } }return dp[n][m];}intmain(){int n;cin >> n;for (int i = 0; i < n; i++) {string str1, str2;cin >> str1 >> str2;cout << EditDistance(str1, str2) << endl; }return 0;}青少年编程竞赛交流
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),添加小助手微信,让他邀请大家进入学习群。进群之后大家可以参与定期组织的21天刷题打卡、等级考试测评、教育部白名单比赛辅导以及青少年编程组队竞赛等活动。
