NOIP复赛C++试题解析:数字统计与接水问题

版权申诉
0 下载量 136 浏览量 更新于2024-06-26 收藏 852KB PDF 举报
"这份资料是关于NOIP(全国青少年信息学奥林匹克联赛)复赛的C++编程题目的总结,涵盖了2010年至2015年的部分试题。主要涉及了数字统计和接水问题两个编程题目,适合于对算法和编程有一定基础的学习者进行参考和练习。" 一、【数字统计】 该题目的目标是统计在给定的整数范围内([L, R]),数字2出现的总次数。输入包含两个正整数L和R,输出为数字2出现的次数。题目要求使用C++语言编写程序,通过循环遍历范围内的每一个数,将每个数的每一位分离出来,逐一判断是否为2,然后累加计数。提供的代码示例使用了这种方法,通过`for`循环遍历范围,`while`循环处理每一位数字,如果数字是2,则增加计数器`ans`的值。最后,程序输出累计的次数。 ```cpp #include<cstdio> using namespace std; int main() { int r, l, ans = 0; scanf("%d%d", &r, &l); for (int i = r; i <= l; i++) { // 一一判断 int num = i; while (num > 0) { // 把每一位分离 if (num % 10 == 2) ans++; num /= 10; } } printf("%d", ans); return 0; } ``` 二、【接水问题】 这是一道模拟问题,涉及到队列和水资源分配的优化。问题设定有m个相同供水量的水龙头,n个同学需要接水,每个人的需求量不同。初始状态,前m个同学占据水龙头开始接水,当某同学完成接水后,下一个等待的同学立即接手,确保没有水的浪费。输入包括n(接水人数)和m(水龙头数),以及每个同学的接水量。需要计算出所有同学接完水的总时间。解答这类问题通常需要理解并模拟流程,可以使用队列来管理等待接水的同学,每次接水完成后更新接水时间和队列状态。 这两个题目都是信息竞赛中常见的算法问题,它们锻炼了选手的逻辑思维能力和对基础数据结构(如循环和队列)的理解。对于准备参加类似比赛的学生或编程爱好者来说,这类题目是很好的训练素材。