<蓝桥杯软件赛>零基础备赛20周--第4周--杂题-1

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集
20周的完整安排请点击:20周计划
每周发1个博客,共20周(读者可以按自己的进度选“正常”和“快进”两种计划)。
每周3次集中答疑
,周三、周五、周日晚上,在QQ群上答疑:
在这里插入图片描述

第 4周:  杂题-1

1. 什么是杂题

  正在学编程语言(C/C++、Python、Java),或者刚学过语言,还没有开始学数据结构和算法的同学,有一些疑问:如何快速入门算法竞赛?如何提高编码能力?如何提高计算思维?
  答案是:从杂题开始,并且大量做杂题。
  杂题是什么?
  在算法竞赛中,杂题(英文Ad Hoc)是必不可少的一种题型。所谓杂题,就是不能归类为某个算法或数据结构知识点的编程题。简单地说,杂题不能或不需要套用现成的算法和数据结构,只要学过编程语言就能做,考核思维、逻辑、编码能力。
  杂题有模拟题、构造题、思维题、找规律题等,这些题可能比较简单,也可能比较难。
  下面用3题说明杂题的难度,分别是简单题、中等题、难题。
  (1)简单题:油漆面积
  这一题要得满分很难,不过30%左右的分数有简单方法。
  (2)中等题:外卖店优先级
  是不是感觉有点难?看看代码:外卖店优先级的代码
  (3)难题。如果中等题让人有点绝望,下面这道题更绝望:点灯游戏
  如果想了很久还没有思路,这里是题解:点灯游戏的题解和代码

2. 杂题和编程能力

  通过大量练习杂题,提高编码能力,建立计算思维,并积累一些编程和建模的技巧。
  (1)提高编码能力。精通编程语言是程序员的基本功。写代码时,对于编程语言的语法、简单逻辑、常用系统函数能做到不假思索、基本不出错。具体要精通的内容,翻开一本C/C++语言教材,包括这些:数据类型、运算符、输入输出、简单字符处理、选择结构、循环结构、数组、结构体、函数、指针、文件等。
  (2)建立计算思维。先了解计算思维,这篇文章挺好的:什么是计算思维?
  计算思维是指具有这样的能力:
  (1)描述一个问题;
  (2)确定解决此问题所需的重要细节;
  (3)把问题分解成小的、合乎逻辑的步骤;
  (4)使用这些步骤来创建解决问题的流程(算法);
  (5)评估这个过程。
  计算思维体现了解决问题所需的必要技能:抽象、分解、算法思维、泛化与模式、评估、逻辑

3. 刷题

  参加蓝桥杯时,做杂题的能力有重大作用。
  (1)纯粹的杂题,不需要用什么算法。尽量得满分。
  (2)很多题的100%得分需要算法,30%得分可以用杂题的做法来做。例如前面提到的油漆面积。由于蓝桥杯只有4小时比赛时间,往往来不及得到100%的分数,此时可以用简单的方法得30%的分数。
  后2周就要开始学习数据结构和算法了。在这之前尽量多做杂题,熟悉编程语言、提高编码能力、建立信心,为进一步做好准备。下面是蓝桥题库的题目链接。

  蓝桥题库的模拟题-简单
  蓝桥题库的模拟题-中等
  蓝桥题库的模拟题-困难

  蓝桥题库的枚举题-简单
  蓝桥题库的枚举题-中等
  蓝桥题库的枚举题-困难

  蓝桥题库的递归题

  下周的主题还是杂题,将介绍和讲解一些较难的杂题。

### 蓝桥杯 2021 B组 最少刷数 C++ 解法 #### 目解析 此问的核心在于模拟小明每日刷的过程并判断在哪一天累计完成的目数量达到或超过目标值 \(n\)。通过分析每的工作模式,可以得出以下结论: - **工作日(一到五)**:每天完成 \(a\) 道目。 - **末(六和日)**:每天完成 \(b\) 道目。 为了高效解决该问,可以通过分阶段累加的方式逐步逼近目标值 \(n\),直到满足条件为止[^2]。 --- #### 实现思路 1. 定义变量存储当前已完成的总目数 `total` 和已过去的天数 `days`。 2. 使用循环逐天增加目数,并更新 `total` 和 `days` 的值。 3. 当前一结束时(即经过了 7 天),重新开始新的一4. 循环终止条件为 `total >= n`。 5. 返回最终所需的天数 `days`。 以下是基于上述逻辑的 C++ 实现代码: ```cpp #include <iostream> using namespace std; int main() { long long a, b, n; cin >> a >> b >> n; long long total = 0; // 已完成的目总数 int days = 0; // 过去的天数 while (true) { // 一至五 for (int i = 0; i < 5 && total < n; ++i) { total += a; days++; if (total >= n) break; } if (total >= n) break; // 六和日 for (int i = 0; i < 2 && total < n; ++i) { total += b; days++; if (total >= n) break; } if (total >= n) break; } cout << days; return 0; } ``` --- #### 关键点说明 1. **数据范围处理** 根据目描述中的约束条件 \(1 \leq a, b, n \leq 10^{18}\),需使用 `long long` 类型来防止溢出。 2. **效率优化** 如果直接按天逐一累加可能会导致性能瓶颈,因此可以在每次完整的一结束后快速跳过多个期,减少不必要的迭代次数[^3]。 --- #### 测试用例验证 对于给定样例输入: ``` 10 20 99 ``` 程序运行过程如下: -1 至第 5 天:\(10 \times 5 = 50\), 总计 50 - 第 6 天(六):\(50 + 20 = 70\); - 第 7 天(日):\(70 + 20 = 90\); - 第 8 天(下一):\(90 + 10 = 100\) (满足条件)。 输出结果为: ``` 8 ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗勇军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值