当前位置:   article > 正文

蓝桥杯知识点总结C++_蓝桥杯c/c++需要知道哪些知识

蓝桥杯c/c++需要知道哪些知识

目录

1、暴力、枚举

2、日期问题

①判断闰年

②判断日期是否合理

③借助excel计算 

3、数的处理

①素筛

1、简单素筛:

2、埃氏筛

②最大公约数(欧几里得)

1、单个数:

2、多个数:

③最小公倍数

1、单个数:

2、多个数:

④二分

4、dp——01背包

5、搜索

①dfs

6、C++里常用函数

①排序函数sort函数

②初始化函数memset

③数学函数

7、string


1、暴力、枚举

一般是多重循环、注意边界和出口

2、日期问题

判断闰年

  1. int check(int x)
  2. {
  3. if(x%400==0||(x%4==0&&x%100!=0)
  4. return 1;
  5. return 0;
  6. }

②判断日期是否合理

  1. int check(int year,int month,int day)
  2. {
  3. int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  4. if(year%4==0&&year%100!=0||year%400==0)//闰年判断
  5. a[2]+=1;
  6. if(month<1||month>12)//判断月份是否出界
  7. return 0;
  8. int t=a[month];
  9. if(day<1||day>t)
  10. return 0;
  11. return 1;
  12. }

③借助excel计算 

3、数的处理

①素筛

1、简单素筛:

  1. int prime(int n)
  2. {
  3. if(n==1)
  4. return 0;
  5. for(int i=2;i*i<n;i++)
  6. {
  7. if(n%i==0)return 0;
  8. }
  9. return 1;
  10. }

2、埃氏筛

思想:从2开始,将每个质数的倍数都标记成合数

  1. int a[MAXN];
  2. void prime()
  3. {
  4. memset(a,1,sizeof(a); //初始化为都是素数
  5. a[0]=a[1]=0;//0和1不是素数
  6. for(int i=2;i<=MAXN;i++)
  7. {
  8. if(a[i])
  9. {
  10. for(int j=i*i;j<MAXN;j=j+i)
  11. a[j]=0;//i的倍数都不是素数
  12. }
  13. }
  14. }

最大公约数(欧几里得)

  1. 因为a / b = k(余r)
  2. 所以 a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),
  3. 则r = a mod b假设d是a,b的一个公约数,
  4. 则 a%d == 0, b%d == 0而r = a - kb,
  5. 两边同时除以d,r/d=a/d-kb/d=m,
  6. 由等式右边可知m为整数,因此r%d==0而r=a mod b,
  7. 因此d也是b,a mod b的公约数假设d是b,a mod b的公约数,
  8. 则b%d == 0,(a-k*b)%d == 0(a − k ∗ b a-k*ba−k∗b)%d = a%d-k∗ *∗b%d == 0 ,
  9. k是一个整数。进而a%d == 0.
  10. 因此d也是a,b的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等

1、单个数:

  1. int gcd(int a,int b)
  2. {
  3. return b?gcd(b,a%b):a;
  4. }

2、多个数:

  1. int gcds(int a[],int n)
  2. {
  3. int g=a[0];
  4. for(int i=1;i<n;i++)
  5. {
  6. g=gcd(g,a[i]);
  7. }
  8. return g;
  9. }

③最小公倍数

两个数的最小公倍数等于他俩乘积除以最大公约数(a*b/gcd(a,b))

1、单个数:

  1. int lcm(int a,int b)
  2. {
  3. return a*b/gcd(a,b);
  4. }

2、多个数:

  1. int lcms(int a[],int n)
  2. {
  3. int l=a[0];
  4. for(int i=1;i<n;i++)
  5. {
  6. l=lcm(a[i],l);
  7. }
  8. return l;
  9. }

④二分

  1. int i=0,j=100001;//所给范围
  2. while(i<=j)
  3. {
  4. int mid=(i+j)/2;//二分法将mid看作边长
  5. if(check(mid))//假如已经符合就继续往上查找
  6. i=mid+1;//找到符合题意的最大边长
  7. else
  8. j=mid-1;//往下查找
  9. }

4、dp——01背包

已知条件

①有N个物品,有一个背包。背包的容量是V。

②对于每个物品有:体积,价值

③每个物品只能使用


需要满足两个条件


①选择的这i个物品总体积不超过V
②这些物品的价值加起来最大
③对于某一个物品:使用/不使用

分析:

如果不拿就有j空间分给i-1个物品

如果拿了就只要j-c[i]的空间分给i-1个物品,c[i]的空间分给第i个物品

给i-1个物品分配j-c[i]空间和分配j空间带来的总价值是不一样的

  1. #include<bits/stdc++.h>//万能头文件
  2. #define ll long long
  3. using namespace std;
  4. const ll maxn=100;
  5. ll n,v,f[maxn][maxn];
  6. ll c[maxn];//每个物品占用空间
  7. ll w[maxn];//每个物品的价值
  8. int main()
  9. {
  10. cin>>n>>v;
  11. for(ll i=1;i<=n;i++)
  12. scanf("%lld",&c[i]);
  13. for(ll i=1;i<=n;i++)
  14. scanf("%lld",&w[i]);
  15. for(ll i=1;i<=n;i++)//第i个物品
  16. for(ll j=v;j>=0;j--)//剩余空间j
  17. {
  18. if(j >= c[i])//如果装得下
  19. f[i][j]=max( f[i-1][j-c[i]]+w[i],f[i-1][j]);
  20. else//如果装不下
  21. f[i][j]=f[i-1][j];
  22. }
  23. cout<<f[n][v]<<endl;//输出答案
  24. }

5、搜索

①dfs

  1. void dfs(int x,int y)
  2. {
  3. if(x==fx&&y==fy)//出口
  4. {
  5. sum++;return ;
  6. }
  7. for(int i=0;i<4;i++)
  8. {
  9. int nx=x+s[i][0];
  10. int ny=y+s[i][1];
  11. if(nx<1||nx>n||ny<1||ny>m||mp[nx][xy]==1||vis[nx][ny]==1)
  12. continue;//边界条件以及是否有障碍或已走过
  13. vis[nx][ny]=1;//标记走过
  14. dfs(nx,ny);//递归
  15. vis[nx][ny]=0//回溯
  16. }
  17. }

6、C++里常用函数

①排序函数sort函数

sort(a,a+num)

初始化函数memset

memset(a,0,sizeof (a));

③数学函数

1.、abs——求整数的绝对值  

2、 pow——求x的次幂

3、sqrt——计算平方根

7、string

string类的常用方法_turbo夏日漱石的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/393087
推荐阅读
相关标签
  

闽ICP备14008679号