蓝桥杯省赛刷题总结

这几天在写省赛真题,难的题不会做,简单的做出来答案又不对,感觉很烦,还是心平气和地认真写吧,好多细节要注意

1.题目(超级重要)
第十届的第四个填空题不难,2019分解为3个数,但是我的答案一直有问题,后来看题
是分解为3个互不相同的数。会做的题一定要抓住。
解决:读题细致,看题的时候把重点写到纸上。

2.数据范围
蓝桥杯给出的样例一般都很简单,都算是特殊情况
一定要看下面的测试用例的规模和范围。

3.结果检查
往往写出来后就不管了,只用测试样例测试正确不代表完全正确,可以
自己试一下其他的样例,也可以在某些地方添加输出来观察运行过程。

5.小技巧
	1char a[100];  puts(a);  输出a
	2》取后几位时,数据过大,防止溢出
		(a+b)%c=(a%c+b%c)%c
	    (a*b)%c=(a%c*b%c)%c
	3》数字拆解
		stack<int> a;
		while(n!=0)
		{	
			a.push(n%10);
			n=n/10;
		}
	4》进制转换
		
		

4.函数总结

0)3%10=3

1)sort()//排列
sort(a,a+n)//将数组a[n]从小到大排列
//若要从大到小排列
bool cmp(int a,int b)
{
  return a>b;
}
sort(a,a+n,cmp);
//结构体比较大小 依然是从小到大排列
struct point{
int x;
int y;
};
bool cmp(point a,point b)
{
    if(a.y<b.y) return true;
    if(a.y==b.y&&a.x<b.x) return true;
    return false;
}
----------------------

2)reverse()//将数组或字符串倒过来  --->algorithm
//数组
int a[10]={10,11,12,13,14,15};
reverse(a,a+4);
//字符串
string str="abcdefghi";
reverse(str.begin()+2,str.begin()+6);
------------------------------

3)next_permutation()//全排列 --->algorithm
int a[10]={4,9,2};
next_permutation(a,a+3);
do{
     cout<<a[0]<<a[1]<<a[2]<<endl;
}while(next_permutation(a,a+3)); 
----------------------------------- 

4)pow()//x的y次方 --->cmath
double pow(double X,int Y);
float pow(float X,float Y);
float pow(float X,int Y);
long double pow(long double X,long double Y);
long double pow(long double X,int Y);
//pow(int,int)是错的,可用pow((float)int,int),即将前一个int类型强制转换为float
--------------------------------

5)sqrt()//开根号 --->math.h
double sqrt(double x);
----------------
6swap()//交换

7)取一个数的各个位上的数字
int a=n%10;//个位
int b=(n/10)%10;//十位
int c=(n/100)%10;//百位
//判断一个数中是否包含2,4
bool judge(int n)
{	int temp;
	while(n){
	temp=n%10;
	if(temp==2||temp==4) return false;
	n=n/10;
	}
	return true;
}
---------------------

8)求最大公因子
https://blog.csdn.net/weixin_30556161/article/details/94946629
int gcd(int a,int b)
{
	int m=a>b?a:b;
	int n=a<b?a:b;
	while(m%n){
	m=n;
	n=m%n;
	}
	return m;
}
//递归
int gcd(int a,int b)
{
	if(b==0) return a; 
	else return gcd(b,a%b);
}
//求n个数的最大公因子
int gcdN(int len)
{
	if(len==1) return a[len-1];	
	else gcd(a[len-1],gcdN(len-1));
}//gcdN(len)返回前len个数的最大公因子
//求n个数的最大公因子就是求前n-1个数的最大公因子,与第n个数的最大公因子

------------------------

9)map 	--> include<map>
用map来查找数时间复杂度大幅度降低
https://blog.csdn.net/qq_38016957/article/details/88751842
https://www.cnblogs.com/yonglin1998/p/11780828.html
  1》构造
  	map<string, int> stu;
  2》插入
  	stu.insert(pair<string, int>("zhangsan",1));
  	stu["zhangsan"] = 1;
  3》map的大小
  	Int nSize = stu.size();
  4》迭代
	map<string,int>::iterator iter;
    for(iter=stu.begin();iter!=stu.end();iter++)
        cout<<iter->first<<" "<<iter->second<<endl;
    iter迭代器指向的数据类型是map<string,int>
    iter->first输出map的key
    iter->second输出map的value
  5》查找
  	1)stu.count("zhangsan")
  		找到	返回1
  		没找到	返回0
  	2)用find函数来定位数据出现位置,它返回的一个迭代器,当数据出
  	现时,它返回数据所在位置的迭代器,如果map中没有要查找的数
  	据,它返回的迭代器等于end函数返回的迭代器
  		iter=stu.find("zhagnsan");
    	if(iter!=stu.end())
        	cout<<iter->first<<" "<<iter->second;
  6》删除
  	  iterator erase(iterator it);//通过一个条目对象删除
	  iterator erase(iterator first,iterator last)//删除一个范围
	  size_type erase(const Key&key);//通过关键字删除
	  stu.erase("zhangsan");

一些处理技巧
1.如果键值是一一对应的,当题目要求给键输出值,给值输出键的时候。
由于是一一对应的,所以不需要建2个map,直接在一个map里,
令map[]=值,map[]=2.如果键对应的是一串信息,比如 01 张三 男 23
可以直接将01 张三 男 23 或者 张三 男 23 看成字符串并当成值。
而不需要另外建一个结构体
----------------------------

10)队列的使用 -->include<queque>
循环报数游戏里,给定某个数,一旦报到这个数的倍数或报出的数字中含这个数
就淘汰。问最后谁赢。
这种问题最烦的就是爆出来的数和人编号的对应关系,用队列可以很好解决这种问题。
  for(int i=1;i<=n;i++)
        a.push(i);
    while(n>1)
    {
        if(judge(flag)) { a.pop();  n--; }
        else{ int tmp=a.front(); a.pop();  a.push(tmp);}
        flag++;
    }
//queue常用函数
queue<int> que;
que.push(2);//插入2到队列最末
que.pop();//吐出队首元素,无返回值
que.front();//返回队首元素
que.back();//返回队尾元素
que.size();//返回队列大小
que.empty();//是否为空,空则返回true
------------------------------------------------

11)常用字符处理函数
https://blog.csdn.net/qq_43309286/article/details/93191767
>string.h库函数 
>https://www.runoob.com/cprogramming/c-standard-library-string-h.html
1int strcmp(const char *str1,const char *str2)
	str1==str2   0
	str1>str2   >0
	str2<str2  	<0
2char *strstr(const char *str1, const char *str2)
	str1中包含str2  返回str2
	不包含 			返回null
3char *strcpy(char *str2, const char *str1)
	把str1复制到str2中
4int strlen(const char *str)
	返回str的长度

>string类
>https://blog.csdn.net/Krismile_/article/details/89765057
>string的最大长度2147483647
1int compare(const string &s) const;
	str1.compare(str2)
	str1==str2 		0
	str1>str2 		1
	str1<str2	   -1
2》string substr(int pos = 0,int n = npos) const
	返回pos开始的n个字符组成的字符串
3int find(char c, int pos = 0) const
   int find(const string &s, int pos = 0) const
   str1.find(str2)
   str2是str1的子串     返回开始出现的位置
   不是					返回4294967295
   任何string的npos的值都是4294967295,
   str1.npos==str2.npos=4294967295
4》注意
	虽然可以通过str[1]='A';这种方法改变str
	但是如果开始不先初始化,然后通过下标的方式置值,将输出为空
	no:  string str;	 str[0]='0';  str[1]='a';  str[2]='c';  
	yes: string str="abc";	 str[0]='0';  str[1]='a';  str[2]='c';  

  • 12
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值