蓝桥杯比赛技巧

目录

由算法范围反推算法时间复杂度

直接复制粘贴 

必背的数值

快速排序sort

C++基础操作:

c++字符串和整数相互转换

 最大公约数与最小公倍数


由算法范围反推算法时间复杂度

一般ACM ,NOI(CSP)或者笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在(10^7)为最佳
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:


n≤30,指数级别, dfs+剪枝,状态压缩dp


n ≤100 => O(n3), floyd,dp


n ≤1000 => O(n2),O(n2log(n)),dp,二分n ≤10000 => o(n√n),块状链表


n≤100000 =>O(nlog(n))=>各种sort,线段树、树状数组、set/map、heap、djkstra+heap、spfa、求凸包、求半平面交、二分


n≤1000000 =>O(n),以及常数较小的O(nlogn.)算法=> hash、双指针扫描、kmp、AC自动机,常数比较小的O(nlogn)的做法: sort、树状数组、heap、dijkstra、spfa


n ≤107 => o(n),双指针扫描、 kmp、AC自动机、线性筛素数n≤109=> o(√n),判断质数


n≤1018 => o(logn),最大公约数
 

直接复制粘贴 

进入考场,我们最好将下列头文件和主函数写到电脑的记事本里,这样的话,每写一个程序时直接复制粘贴即可,把时间省下来用于后面难题的调试!

//#include     同样是ctrl+c,为啥要搞万能头呢
#include
#include
#include
#include
#include
typedef long long LL;
const int N=1e5+10;

using namespace std;
 
int main()
{
 
	return 0;
}

必背的数值

蓝桥杯比赛技巧_第1张图片

 2^{0} ~ 2^{10}:1,2,4,8,16,32,64,128,256,512,1024

2^{15}:32768

2^{16}:65536

2^{20} \approx 10^{6}

2^{63} \approx 10^{18}

快速排序sort

sort(a,a+12);

sort(a,a+12,greater() ); 

#include
#include
using namespace std;
int main()
{
	int a[12]={12,32,234,45,65,9,0,11,2,3,-3,-21};


	sort(a,a+12);    //默认从小到大
	for(int i=0;i<12;i++){
		cout<() );    //从大到小
	for(int i=0;i<12;i++){
		cout<
-21 -3 0 2 3 9 11 12 32 45 65 234
234 65 45 32 12 11 9 3 2 0 -3 -21

C++基础操作:

	c=max(a,b);
	c=min(a,b); 
	
	//交换变量值
	swap(a,b) 

	//绝对值
	m=abs(m); 
	
	//查找
	lower_bound(first,last,value);//查找有序数组第一个小于等于value的值 
	upper_bound(first,last,value);//查找有序数组第一个大于等于value的值 
	 
	//引用 取别名就是小名
	int a=10;
	int &b=a;
	//对b的操作也就是对a的操作,a,b代表同一个东西 
	//引用必须初始化,引用不能更改,只给一个变量用
		
 	//异或 ^ 

//下标从0开始 
	s.insert(pos,s2);//第pos个位置插入s2
	s.erase(pos,num);//第pos个位置删除num个字符
	s.substr(pos,num);//第pos个位置截取num个字符 ,父串不变 
	
	s1.find(s2,pos);//在s1中从pos个位置找s2
	//s1.find(s2) 默认从0开始 
	
	

c++字符串和整数相互转换

字符串转整形:

typedef long long ll;
ll tra(string x) {    		//字符串转整
	ll num=0;
	ll n=1;
	for (int i = x.length()-1; i >=0 ; i--) {
		num += (x[i] - '0') * n;
		n *= 10;
	}
	return num;
}

 C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

#include 
#include 
#include 

int main()
{
   int val;
   char str[20];
   
   strcpy(str, "98993489");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

   strcpy(str, "runoob.com");
   val = atoi(str);
   printf("字符串值 = %s, 整型值 = %d\n", str, val);

   return(0);
}

注意:只有字符储存在char类型字符数组里面时才可以用,string不可用!!! 

整形转字符串:

itoa(i ,num ,10 );

i ---- 需要转换成字符串的数字

num ---- 转换后保存字符串的变量

10 ---- 转换数字的基数(即进制)。10就是说按10进制转换数字。还可以是2,8,16等等你喜欢的进制类型

返回值:指向num这个字符串的指针

#include 
#include 
int main(void)
{
    int number = 12345;
    char str[32];
    itoa(number, string, 10);
    printf("integer = %d string = %s\n", number, str);
    return 0;
}

 最大公约数与最小公倍数

 最大公约数:

int gcd(int a,int b)	//欧几里得算法 
{
	return b?gcd(b,a%b):a;
}
while(m%n)    //辗转相除法
{
	int r=m%n;
	m=n;
	n=r;
}
cout<
int gcd(int a, int b) //递归
{
    if(b==0)
	{
        return a;
    }
	else
	{
    	return gcd(b,a%b);
    }
}

 最小公倍数:

 a*b/最大公约数=最小公倍数

你可能感兴趣的:(笔记,蓝桥杯,c++,算法,c语言,c#)