暴力出奇迹,挂分直接寄

## 挂分技巧总结

#### 考试结束前要检查的

1. 文件名
2. 编译:比赛过程中严格按照题目给定编译选项编译。比赛结束前把每个题的可执行文件删掉然后编译一遍,新生成一个可执行文件。看 Warning.
3. 数组大小:是否满足空间限制(各个 namespace 的内存和栈空间消耗的总和)、是否开够了(严防差 1)、指针大小为 4 字节(32 位机)、deque 和 queue 占内存很大
4. 有取模的题要检查取模
5. 多测清空:千万注意表示个数的变量,一旦不清空导致个数累计,小数据测不出来;小心每次 ```memset``` 整个数组造成 $O(T\cdot \text{max}N)$ 的复杂度
6. Warning 一定要开,写完题之后一定要看,但不能因为开了 Warning 而忽视其他几条
7. 调试输出要删,某些输出方案或大讨论题删的时候必须格外小心,不要把输出答案的部分删了
8. long long 的问题:逐个检查有没有要开的地方没开、输入输出用 %lld、注意不要乘爆、卡常题别用 ```#define int long long``` (NOI Linux 是 32 位的)
9. 输入输出:严格按照数据类型读入,注意时间消耗
10. 写完题之后要测极限数据(因为有些挂分会导致 TLE/RE 而不是 WA)
11. 数据分治:写了数据分治的题目,最好在比赛最后把每个部分分都造一组数据测一测,并确保你运行的是这个部分分对应的那个子程序。
12. 特判:看各个变量取值范围的下界,例如 $n=1$ 有时要特判
13. 越到考试结束前,改代码越要冷静、慎重!!

#### 迷惑挂分纪实

1. fread 写挂
2. 在比赛最后不小心把读入 $a_i $ 的语句放到了数据分治的某个分支里,导致另一个分支没有成功读入;并且造数据测试时只测了一个分支
3. CSP2019 D1T1 过了大样例之后忘记测小样例,然而大样例 $n$ 是偶数,实际上自己的代码在 $n$ 是奇数时都会挂。
4. PKUWC2018 D1T1 题目给定条件“$0\le a_i\le ...$”因为没有意识到 $a_i$ 可以是 $0$ 导致一直只有 $10$ 分。
5. Dijkstra 写成了大根堆
6. 用 %d 输出了 long long 或者用 %lld 输出了 int
7. 树状数组修改下标为 $0$ 导致死循环
8. 对拍程序没有每运行一次就换一个种子导致对拍效率很低(windows/linux 的 time(0) 一秒一变,导致如果使用 time(0) 作种子一秒只能拍一组)

在NOIP竞赛中,暴力解法是一种常见且有效的策略,尤其是在时间有限或题目难度较高的情况下。暴力解法的核心思想是通过直接模拟题意或枚举所有可能情况来解决问题,尽管这种方法在时间复杂度上通常不如高效算法优,但在某些特定条件下仍能帮助选手获得可观的数。 ### 暴力解法的基本思路 暴力解法通常包括直接模拟、枚举、递归等方法。在NOIP中,许多题目的测试数据规模较小,尤其是部测试点的输入规模有限,这为暴力解法提供了施展空间。例如,在搜索类问题中,即使时间复杂度较高,也可能通过部测试点[^1]。 ### 暴力解法的适用场景 1. **时间紧迫时**:当时间不足以思考更高效的算法时,可以优先写暴力解法,确保至少通过部测试点。 2. **部值较高**:某些题目会根据输入规模给不同的数,较小的输入规模往往对应较高的数比例,暴力解法可以针对这些测试点进行优化。 3. **无法想到正解时**:如果对题目没有清晰的解法思路,可以通过暴力解法尽可能多地得,而不是完全放弃。 ### 暴力解法的优化技巧 1. **剪枝优化**:在暴力枚举或搜索过程中,加入剪枝条件可以显著减少无效计算,提高程序效率。例如,在搜索过程中,如果当前路径已经不可能得到更优解,则可以提前终止。 2. **局部优化**:针对某些特定的输入情况,可以对暴力解法进行局部优化。例如,在枚举过程中,优先处理可能性较大的情况,减少不必要的计算。 3. **利用题目特性**:某些题目可能具有特定的性质,例如输入数据的范围较小、数据结构较为简单等。利用这些特性,可以简化暴力解法的实现,提高效率。 ### 暴力解法的注意事项 1. **避免过度依赖暴力解法**:虽然暴力解法在某些情况下可以得,但在难度较高的题目中,暴力解法往往无法通过全部测试点。因此,建议在时间允许的情况下尽量思考更高效的算法。 2. **注意时间复杂度**:暴力解法的时间复杂度通常较高,因此需要评估程序是否能在规定时间内完成所有测试点。如果发现暴力解法可能会超时,应考虑优化或调整策略。 3. **代码简洁性**:暴力解法的代码通常较为简单,但也要注意代码的可读性和可维护性,避免因代码混乱导致调试困难。 ### 示例代码 以下是一个简单的暴力解法示例,用于解决一个枚举问题: ```cpp #include <iostream> using namespace std; int main() { int n, target; cin >> n >> target; int a[n]; for (int i = 0; i < n; i++) { cin >> a[i]; } // 暴力枚举所有可能的子数组 for (int i = 0; i < n; i++) { int sum = 0; for (int j = i; j < n; j++) { sum += a[j]; if (sum == target) { cout << "Found subarray from index " << i << " to " << j << endl; return 0; } } } cout << "No subarray found" << endl; return 0; } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值