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

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

  • 2026-09-26 00:00:09
【第36期】21天养成编程习惯:C++刷题第06天

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

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

Day06:GESP一级2024.09_小杨购物

【提交】

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

【问题描述】

小杨有  元钱用于购物。商品  的单价是  元,商品  的单价是  元。小杨想购买 相同数量 的商品  和商品 。

请你编写程序帮小杨计算出他最多能够购买多少个商品  和商品 。

【输入描述】

第一行包含一个正整数 ,代表小杨用于购物的钱的金额。

第二行包含一个正整数 ,代表商品  的单价。

第三行包含一个正整数 ,代表商品  的单价。

【输出描述】

输出一行,包含一个整数,代表小杨最多能够购买的商品  和商品  的数量。

【样例输入1】

1212

【样例输出1】

4

【提示】

对于样例1,由于需要购买相同数量的两种商品,因此小杨最多能够购买  件商品  和  件商品 ,共花费  元。因此,样例1的答案为 。

【样例输入2】

1312

【样例输出1】

4

【提示】

对于样例2,由于需要购买相同数量的两种商品,因此小杨最多能够购买  件商品  和  件商品 ,共花费  元。如果小杨想购买  件商品  和  件商品 ,则需花费  元,超过了小杨的预算  元。因此,样例2的答案为 。

对于全部数据,保证有 。

参考答案:

/** GESP一级2024.09_小杨购物* https://www.luogu.com.cn/problem/B4034*/#include<iostream>usingnamespacestd;intmain(){int n, a, b;cin >> n >> a >> b;cout << n / (a + b) << "\n";return0;}

Day06:Openjudge1.5.43_质因数分解

【提交】

http://noi.openjudge.cn/ch0105/43/

【描述】

已知正整数  是两个不同的质数的乘积,试求出较大的那个质数。

【输入】

输入只有一行,包含一个正整数 。

  • 对于的数据,。
  • 对于的数据,。

【输出】

输出只有一行,包含一个正整数 ,即较大的那个质数。

【样例输入】

21

【样例输出】

7

【来源】

NOIP2012复赛 普及组 第一题

【参考程序】

C语言版本

/** # 43:质因数分解* http://noi.openjudge.cn/ch0105/43/*/#include<cmath>#include<cstdio>intmain(){int n;scanf("%d", &n);for (int i = 2; i <= sqrt(n); i++)    {if (n % i == 0)        {printf("%d", n / i);break;        }    }return 0;}

C++版本

/** # 43:质因数分解* http://noi.openjudge.cn/ch0105/43/*/#include<cmath>#include<iostream>using namespace std;intmain(){int n;cin >> n;for (int i = 2; i <=sqrt(n); i++)    {if (n % i == 0)        {cout << n / i;break;        }    }return 0;}

Day06:Openjudge1.7.04_石头剪子布

【提交】

http://noi.openjudge.cn/ch0107/04/

【描述】

石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。

游戏规则:石头打剪刀,布包石头,剪刀剪布。

现在,需要你写一个程序来判断石头剪子布游戏的结果。

【输入】

输入包括行:

第一行是一个整数,表示一共进行了次游戏。。

接下来行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):字符串之间以空格隔开,只可能取值在{"Rock", "Scissors", "Paper"}(大小写敏感)中。

【输出】

输出包括行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。

【样例输入】

3Rock ScissorsPaper PaperRock Paper

【样例输出】

Player1TiePlayer2

【提示】

Rock是石头,Scissors是剪刀,Paper是布。

【参考程序】

C++版本

/** 04:石头剪子布* http://noi.openjudge.cn/ch0107/04/*/#include<iostream>#include<string>using namespace std;intmain(){int n;string s1, s2;cin >> n;for (int i = 0; i < n; i++)    {cin >> s1 >> s2;if (s1 == "Rock")        {if (s2 == "Rock")            {cout << "Tie" << endl;            }else if (s2 == "Scissors")            {cout << "Player1" << endl;            }else            {cout << "Player2" << endl;            }        }else if (s1 == "Scissors")        {if (s2 == "Rock")            {cout << "Player2" << endl;            }else if (s2 == "Scissors")            {cout << "Tie" << endl;            }else            {cout << "Player1" << endl;            }        }else        {if (s2 == "Rock")            {cout << "Player1" << endl;            }else if (s2 == "Scissors")            {cout << "Player2" << endl;            }else            {cout << "Tie" << endl;            }        }    }return 0;}

Day06:GESP四级2025.06_画布裁剪

【提交】

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

【问题描述】

小 A 在高为  宽为  的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为  行  列的字符矩阵,其中的字符均为 ASCII 码位于  之间的可见字符,小 A 只保留画布中由第  行到第  行、第  列到第  列构成的子矩阵。

小 A 将画布交给了你,你能帮他完成画布的裁剪吗?

【输入描述】

第一行,两个正整数 ,分别表示画布的行数与列数。

第二行,四个正整数 ,表示保留的行列边界。

接下来  行,每行一个长度为  的字符串,表示画布内容。

【输出描述】

输出共  行,每行一个长度为  的字符串,表示裁剪后的画布。

【样例输入1】

3 52 2 2 4......>_<......

【样例输出1】

>_<

【样例输入2】

5 51 2 3 4AbCdEfGhIkLmNoPqRsTuVwXyZ

【样例输出2】

CdhI

【数据范围】

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

参考答案:

/** [GESP202506 四级] 画布裁剪* https://www.luogu.com.cn/problem/B4360*/#include<iostream>using namespace std;char arr[105][105];intmain(){int h, w;cin >> h >> w;int x1, x2, y1, y2;cin >> x1 >> x2 >> y1 >> y2;for (int i = 1;i <= h;i++)    {for (int j = 1;j <= w;j++)        {cin >> arr[i][j];        }    }for (int x = x1;x <= x2;x++)    {for (int y = y1;y <= y2;y++)        {cout << arr[x][y];        }cout << endl;    }return 0;}

Day06:GESP五级2023.09_因数分解

【提交】

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

【问题描述】

每个正整数都可以分解成素数的乘积,例如:、。

现在,给定一个正整数 ,请按要求输出它的因数分解式。

【输入描述】

输入第一行,包含一个正整数 。约定

【输出描述】

输出一行,为  的因数分解式。要求按质因数由小到大排列,乘号用星号*表示,且左右各空一格。当且仅当一个素数出现多次时,将它们合并为指数形式,用上箭头^表示,且左右不空格。

【样例输入1】

6

【样例输出1】

2 * 3

【样例输入2】

20

【样例输出2】

2^2 * 5

【样例输入3】

23

【样例输出3】

23

参考答案:

/** [GESP202309 五级] 因数分解* https://www.luogu.com.cn/problem/B3871*/# include<iostream># include<vector>using namespace std;intmain(){long long N;cin >> N;bool first = true;for (long long p = 2;p * p <= N;p++)    {if (N % p != 0)continue;int cnt = 0;while (N % p == 0)        {            cnt += 1;            N /= p;        }if (first)        {            first = false;        }else        {cout << " * ";        }cout << p;if (cnt > 1)        {cout << "^" << cnt;        }    }if (N > 1)    {if (first)        {            first = false;        }else        {cout << " * ";        }cout << N;    }return 0;}

Day06:GESP六级2024.06_计算得分

【提交】

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

【问题描述】

小杨想要计算由  个小写字母组成的字符串的得分。

小杨设置了一个包含  个正整数的计分序列 ,如果字符串的一个子串由  个  首尾相接组成,那么能够得到分数 ,并且字符串包含的字符不能够重复计算得分,整个字符串的得分是计分子串的总和。

例如,假设 ,字符串  的所有可能计分方式如下:

  •  或者 ,其中  和  不计算得分,总得分为 。
  • ,总得分为 。
  • ,总得分为 。

小杨想知道对于给定的字符串,最大总得分是多少。

【输入描述】

  • 第一行包含一个正整数 ,代表计分序列  的长度。
  • 第二行包含  个正整数,代表计分序列 。
  • 第三行包含一个正整数 ,代表字符串的长度。
  • 第四行包含一个由  个小写字母组成的字符串。

【输出描述】

输出一个整数,代表给定字符串的最大总得分。

【样例输入1】

33 1 213dabcabcabcabz

【样例输出1】

9

【样例解释】

最优的计分方式为 ,总得分为 ,共  分。

【数据范围】

对于全部数据,保证有 ,,。

参考答案:

/** [GESP202406 六级] 计算得分* https://www.luogu.com.cn/problem/P10721*/#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;// 检查从位置start开始的连续k个"abc"是否有效boolisValidABC(conststring& s, int start, int k){for (int j = 0; j < k; ++j)    {int pos = start + 3 * j;if (s.substr(pos, 3) != "abc")         {return false;        }    }return true;}intmain(){// 输入处理int n;  // 计分序列长度cin >> n;vector<int> a(n + 1);  // 计分序列,a[1]到a[n]for (int i = 1; i <= n; ++i)    {cin >> a[i];    }int m;  // 字符串长度cin >> m;string s;  // 输入字符串cin >> s;// dp[i]表示前i个字符的最大得分vector<longlong> dp(m + 1, 0);for (int i = 3; i <= m; ++i) // 从第3个字符开始检查    {        dp[i] = dp[i - 1];  // 初始化为不选当前字符的情况// 快速检查:只有当前字符是'c'时才可能构成"abc"if (s[i - 1] == 'c') // 注意字符串索引从0开始,所以是s[i-1]        {// 检查所有可能的k个"abc"组合(k从1到n)for (int k = 1; k <= n && i >= 3 * k; ++k)            {// 检查从i-3k位置开始的k个"abc"是否有效if (isValidABC(s, i - 3 * k, k))                {// 如果有效,更新当前最大得分                    dp[i] = max(dp[i], dp[i - 3 * k] + a[k]);                }            }        }    }// 输出整个字符串的最大得分cout << dp[m] << endl;return0;}

青少年编程竞赛交流

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

最新文章

随机文章