蓝桥杯 模拟赛(预处理的重要性)

本文强调了在编程比赛中预处理的重要性和影响。作者指出,尽管直接调用函数可能更便捷,但在追求时间复杂度优化的竞赛中,预处理能有效减少运行时间。预处理质数等关键代码是提高效率的关键,对于解决如蓝桥杯等竞赛中的问题至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候懒得用预处理,直接调用函数感觉方便太多了!
但是比赛考的一个重点是你的时间复杂度!!
可能就因为没有用空间换时间而导致运行时间过长!!
主要预处理质数代码

void init()  
{  
        memset(Is_or,0,sizeof(Is_or));  
    for(int j=2;j<sqrt(maxn);j++)//  
    {  
        if(Is_or[j]==0)//去掉合数的倍数. 
        {
        for(int k=j+j;k<=maxn;k+=j)//去掉倍数.(把这么些个合数的倍数都标记上这个数不是素数.)  
        Is_or[k]=1;  
        }
    }  
    for(int i=2;i<=maxn;i++)  
    {  
        if(Is_or[i]==0)  
        {  
            su[cont++]=i;  
        }  
    }  
}

比如像这样的代码

#include<iostream>
#include<cmath>
using namespace std;
const int  N=80005;
int pri[N];

int inprime(int n)
{
	for(int i=2;i<=sqrt(n);i++)
	{
		if(n%i==0) return 0;
	}
	return 1;
}

int main()
{
	int ans=0;
	int a;
	cin>>a;
	int c=-1;
	for(int i=2;i<=N;i++)
	{
		if(inprime(i)) pri[++c]=i;
	}
	for(int x=0;x<c;x++)
	{
		if(pri[x]>a) break;
		for(int y=x;y<c;y++)
		{
			if(pri[y]>a) break;
			int z=a-pri[x]-pri[y];
			if(inprime(z)&&z>=pri[y]) ans++;//这里调用函数导致时间过长!!!!
		}
	}
	cout<<ans;
 	return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
const int  N=80005;
int pri[N];

int sd[N];

int inprime(int n)
{
	for(int i=2;i<=sqrt(n);i++)
	{
		if(n%i==0) return 0;
	}
	return 1;
}



int main()
{
	int ans=0;
	int a;
	cin>>a;
	int c=-1;
	for(int i=2;i<=N;i++)
	{
		if(inprime(i)) 
		{
			pri[++c]=i;sd[i]=1;
		}
		else sd[i]=0;
	}
	for(int x=0;x<c;x++)
	{
		if(pri[x]>a) break;
		for(int y=x;y<c;y++)
		{
			if(pri[y]>a) break;
			int z=a-pri[x]-pri[y];
			if(z>=pri[y]&&sd[z]) ans++;//只要预处理数组就可以了!!!
		}
	}
	cout<<ans;
 	return 0;
}


<think>好的,我现在需要帮用户寻找蓝桥杯竞赛C/C++ C组的备赛资料和指导。用户提到了教程、练习题和解题技巧,所以我得覆盖这几个方面。 首先,用户提供的引用里提到了几个关键点。引用[1]提到用户有C语言基础,通过B站黑马程序员学C++,跟着y总学语法和蓝桥杯辅导课。这说明用户可能对视频教程比较感兴趣,尤其是B站资源。我应该推荐一些B站的优质课程,比如黑马程序员的C++教程和y总的辅导课,这些在引用[1]里已经提到过,可以作为重点推荐。 引用[2]和[3]都强调了真题的重要性,用户需要多练习官网题库的真题。因此,练习题部分应该包括蓝桥杯官网的真题,以及一些可靠的刷题平台,比如洛谷、LeetCode等。同时,引用[3]提到算法知识点,可能需要分阶段学习,比如基础语法、算法强化、真题模拟,这可以作为备赛路径的建议。 引用[4]详细讨论了C/C++解题的小技巧和注意事项,比如输入输出优化、调试技巧。这部分内容对用户来说非常实用,应该整理出来,比如使用快读快写函数、数组大小调整、模块化代码等。同时,引用里提到的调试方法,如断言和测试用例,也值得强调。 接下来,我需要考虑用户可能的深层需求。用户可能对如何高效安排学习时间、如何平衡语法学习和算法训练有疑问。因此,备赛路径需要分阶段,从基础到进阶,再到模拟实战,这样用户能有一个清晰的学习计划。 另外,解题技巧方面,用户可能容易在输入输出或调试上浪费时间,所以需要具体的方法,比如预处理指令、避免常见错误(如数组越界)。同时,算法模板的积累也很重要,比如排序、DFS/BFS,这些高频考点需要重点练习。 最后,生成的相关问题需要围绕用户可能进一步的需求,比如如何选择学习资料、时间规划、算法学习顺序、真题使用技巧等。这样用户如果有更多疑问,可以通过这些问题找到答案。 总结一下,回答结构应该是:备赛资源(教程、书籍、题库)、备赛路径(分阶段)、解题技巧(输入输出、调试、算法模板)、注意事项,然后相关问题。需要确保每个部分都引用提供的资料,并自然添加引用标记。同时,语言要口语化,避免使用专业术语过多,保持自然流畅。</think>### 蓝桥杯C/C++ C组备赛指南 根据你的需求,结合蓝桥杯竞赛特点和C/C++组高频考点,整理以下资源与建议: --- #### 一、**备赛资源推荐** 1. **教程与课程** - **B站黑马程序员C++教程**:适合从C语言过渡到C++的选手,覆盖基础语法和STL库(如`vector`、`string`等)[^1]。 - **y总(AcWing)蓝桥杯辅导课**:针对算法强化,包含贪心、动态规划、搜索等核心算法,附带真题解析。 - **《算法竞赛入门经典(第2版)》**:系统讲解算法设计与实现,适合打牢基础。 2. **刷题平台** - **蓝桥杯官方题库**:优先完成历年真题(如第十届至第十三届),熟悉题型和难度分布[^2][^3]。 - **洛谷/LeetCode**:专项训练高频算法(如DFS/BFS、排序、数论)。 - **AcWing蓝桥杯题单**:按知识点分类,适合针对性突破[^1]。 3. **技巧与经验** - **输入输出优化**:使用`scanf/printf`替代`cin/cout`,或添加`ios::sync_with_stdio(false)`加速[^4]。 - **调试技巧**:利用断言(`assert`)和模块化代码减少错误,编写测试用例验证边界条件。 --- #### 二、**备赛路径规划** 1. **阶段一:基础语法与算法入门(1-2个月)** - 学习C++11特性(如`auto`、`lambda`)和STL容器。 - 掌握基础算法:排序(快速排序、归并排序)、二分查找、简单动态规划。 - 推荐练习:蓝桥杯模拟题、《算法笔记》例题。 2. **阶段二:算法强化与真题模拟(2-3个月)** - 重点突破高频考点: - **数论**:最大公约数($gcd$)、质数筛法、快速幂 - **动态规划**:背包问题、最长公共子序列 - **搜索**:DFS剪枝、BFS最短路径 - 每周完成2-3套真题,限时3小时模拟考试环境。 3. **阶段三:冲刺与查漏补缺(1个月)** - 复盘错题,整理高频算法模板(如并查集、线段树)。 - 学习优化技巧:记忆化搜索、状态压缩DP。 --- #### 三、**解题技巧与注意事项** 1. **输入输出优化** - 使用快读函数处理大规模数据: ```cpp inline int read() { int x = 0; char c = getchar(); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x; } ``` - 输出时避免频繁刷新缓冲区,用`'\n'`替代`endl`。 2. **代码调试** - 使用`#define DEBUG`预处理指令快速切换调试模式: ```cpp #ifdef DEBUG freopen("input.txt", "r", stdin); #endif ``` - 避免数组越界:全局数组大小设为$10^6+5$,局部数组谨慎使用。 3. **高频算法模板** - **快速排序**: ```cpp void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l-1, j = r+1, x = q[(l+r)>>1]; while (i < j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j), quick_sort(q, j+1, r); } ``` --- #### 四、**注意事项** 1. **比赛规则**:注意代码提交格式(如`main`函数返回值必须为0)。 2. **时间分配**:简单题优先(如填空题、编程题前3道),难题留到后期。 3. **代码规范**:变量命名清晰,添加必要注释(如复杂逻辑块)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值