当前位置:   article > 正文

蓝桥杯 总结经典基础题型

蓝桥杯 总结经典基础题型

 十进制转R进制

  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. using namespace std;
  5. string tentoR(int x, int r) {
  6. if (x == 0) return "0"; // 如果x为0,直接返回"0"
  7. string s;
  8. while (x) {
  9. int num = x % r;
  10. if (num >= 10) s += 'A' + (num - 10); // 处理10及以上的数字转为字母
  11. else s += num + '0'; // 处理0-9的数字
  12. x /= r;
  13. }
  14. reverse(s.begin(), s.end()); // 反转字符串得到正确的顺序
  15. return s;
  16. }
  17. int main() {
  18. int n, r;
  19. cin >> n >> r;
  20. cout << tentoR(n, r);
  21. return 0;
  22. }

计算一个数转为二进制后有几个1  

  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. using namespace std;
  5. int calebinone(int x)
  6. {
  7. int cnt = 0;
  8. while (x)
  9. {
  10. cnt++;
  11. x &= x - 1;//每次将最后一个1变为0
  12. }
  13. return cnt;
  14. }
  15. int main()
  16. {
  17. int n;
  18. cin >> n;
  19. cout << calebinone(n);
  20. }

异或(^)相同为0,不同为1

最大公约数和最小公倍数(递归版本)

  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. using namespace std;
  5. int gcd(int a, int b) // 最大公约数
  6. {
  7. return b == 0 ? a : gcd(b, a % b);
  8. }
  9. int lcm(int a, int b) // 最小公倍数
  10. {
  11. return a / gcd(a, b) * b;
  12. }
  13. int main()
  14. {
  15. int a, b;
  16. cin >> a >> b;
  17. cout << "最大公约数是:" << gcd(a, b) << endl;
  18. cout << "最小公倍数是:" << lcm(a, b) << endl;
  19. return 0;
  20. }

日期(闰年)

显示某一年的日历

  1. #include<iostream>
  2. using namespace std;
  3. int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  4. // 检查是否为闰年
  5. bool check(int year) {
  6. if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
  7. return true;
  8. return false;
  9. }
  10. int main() {
  11. int y;
  12. cin >> y;
  13. // 根据年份调整二月天数
  14. if(check(y))
  15. days[2] = 29;
  16. else
  17. days[2] = 28; // 确保处理多个年份时对于非闰年,二月的天数正确设置为28天
  18. for(int i = 1; i <= 12; i++) { // 十二个月
  19. for(int j = 1; j <= days[i]; j++)
  20. cout << y << "年" << i << "月" << j << "日" << endl;
  21. }
  22. return 0;
  23. }

判断素数(试除法&埃氏筛) 

  1. #include<iostream>
  2. #include<string>
  3. #include<cmath>
  4. #include<algorithm>
  5. #define int long long
  6. using namespace std;
  7. //单个素数判定--试除法 O(sqrt(n))
  8. bool isprime(int n)
  9. {
  10. if(n<=1) return false;
  11. int sqrtn=sqrt(n);
  12. for(int i=2;i<=sqrtn;i++)
  13. {
  14. if(n%i==0)
  15. return false;
  16. }
  17. return true;
  18. }
  19. //多个素数判定--埃氏筛O(nloglogn)
  20. //找到一个素数把他的倍数全筛出
  21. #include<vector>
  22. const int N=1e6+10;
  23. bool vis[N];//标记一个数是否为素数
  24. vector<int> prime;//素数表
  25. void E_sieve()
  26. {
  27. vis[0]=vis[1]=1;//提前处理1和2为非素数
  28. for(int i=2;i<=N-10;i++)
  29. {
  30. if(!vis[i])//是素数
  31. {
  32. for(int j=2*i;j<=N-10;j+=i)
  33. {
  34. vis[j]=1;
  35. }
  36. }
  37. }
  38. }
  39. signed main()
  40. {
  41. int n;
  42. cin>>n;
  43. cout<<"素数有:"<<endl;
  44. E_sieve();
  45. for(int i=2;i<=n;i++)
  46. {
  47. // if(isprime(i))
  48. // cout<<i<<" ";
  49. if(!vis[i])
  50. cout<<i<<" ";
  51. }
  52. for(auto it:prime) {
  53. if(it>n) break;
  54. cout<<it<<" ";
  55. }
  56. return 0;
  57. }

 计算a的b次方的模运算 

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a,b,mod;
  6. cin>>a>>b>>mod;
  7. int ans=1;
  8. for(int i=1;i<=b;i++)
  9. {
  10. ans*=a%mod;
  11. ans%=mod;
  12. }
  13. cout<<ans;
  14. return 0;
  15. }

前缀和

一维前缀和查询区间和
  1. //一维前缀和
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=1e6+10;
  6. int a[N],ps[N];
  7. int main(){
  8. int n;
  9. cin>>n;
  10. for(int i=1;i<=n;i++)
  11. {
  12. cin>>a[i];
  13. ps[i]=ps[i-1]+a[i];
  14. }
  15. int m;//查询m次区间和
  16. cin>>m;
  17. while(m--)
  18. {
  19. int l,r;
  20. cin>>l>>r;
  21. cout<<ps[r]-ps[l-1]<<endl;
  22. }
  23. return 0;
  24. }
 二维前缀和查询矩阵和(最大子矩阵问题)
  1. #include<iostream>
  2. using namespace std;
  3. const int N=1e3+10;
  4. int a[N][N],ps[N][N];
  5. int main(){
  6. int n; cin>>n;
  7. for(int i=1;i<=n;i++){
  8. for(int j=1;j<=n;j++){
  9. cin>>a[i][j];
  10. ps[i][j]=ps[i-1][j]+ps[i][j-1]-ps[i-1][j-1]+a[i][j];
  11. }
  12. }
  13. int m; cin>>m;
  14. while(m--){
  15. int r1,c1,r2,c2; cin>>r1>>c1>>r2>>c2;
  16. cout<<ps[r2][c2]-ps[r1-1][c2]-ps[r2][c1-1]+ps[r1-1][c1-1]<<endl;
  17. }
  18. return 0;
  19. }

搜索与回溯

全排列模板
  1. #include<iostream>
  2. using namespace std;
  3. string s;
  4. const int N=1e2+10;
  5. char ch[N];
  6. bool vis[N];
  7. void dfs(int dep){
  8. //5.终止条件
  9. if(dep==s.size()+1){
  10. for(int i=1;i<dep;i++){
  11. cout<<ch[i];
  12. } cout<<endl;
  13. return ;
  14. }
  15. //1.枚举搜索方案
  16. for(int i=0;i<s.size();i++){
  17. //2.标记-防止重复搜索
  18. if(!vis[i]){
  19. //3.搜索
  20. vis[i]=1;//标记
  21. ch[dep]=s[i];//记录第dep层搜了谁
  22. dfs(dep+1);//进入下一层继续搜索
  23. //4.回溯
  24. vis[i]=0;
  25. }
  26. }
  27. }
  28. int main(){
  29. cin>>s; //abc
  30. dfs(1);
  31. return 0;
  32. }
迷宫搜索-bfs求无权图最短路 
  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. const int N=1e3+10;
  5. char g[N][N];//迷宫数组
  6. bool vis[N][N];//标记数组
  7. int n,m,sx,sy,tx,ty,ans=-1;
  8. //方向数组
  9. int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
  10. struct point{int x,y,step;};
  11. void bfs(point s){
  12. queue<point> q;
  13. //1.起点入队+标记
  14. q.push(s); vis[s.x][s.y]=1;
  15. //2.循环广搜
  16. while(!q.empty()){
  17. //3.取出当前正在搜索的点
  18. point cur=q.front(); q.pop();
  19. //判断是否是终点
  20. if(cur.x==tx&&cur.y==ty){
  21. ans=cur.step;
  22. return ;
  23. }
  24. //4.沿着邻接点继续搜索
  25. for(int i=0;i<4;i++){
  26. int bx=cur.x+dx[i],by=cur.y+dy[i];
  27. if(bx<1||bx>n||by<1||by>m) continue;
  28. if(g[bx][by]=='*') continue;
  29. if(vis[bx][by]) continue;
  30. q.push({bx,by,cur.step+1});
  31. vis[bx][by]=1;
  32. }
  33. }
  34. }
  35. int main(){
  36. cin>>n>>m;
  37. for(int i=1;i<=n;i++)
  38. for(int j=1;j<=m;j++)
  39. cin>>g[i][j];
  40. cin>>sx>>sy>>tx>>ty;
  41. bfs({sx,sy,0});
  42. cout<<ans<<endl;
  43. return 0;
  44. }
***图论- 有权图多源最短路Floyd
  1. #include<iostream>
  2. #include<climits>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N = 3e3 + 10, INF = INT_MAX;
  6. int g[N][N];//邻接矩阵
  7. bool vis[N];//标记数组
  8. int mindis[N][N];//含义:mindis[i][j]顶点i到顶点j的最短距离
  9. int n = 2021, s = 1;
  10. int gcd(int a, int b) {
  11. return b == 0 ? a : gcd(b, a % b);
  12. }
  13. int lcm(int a, int b) {
  14. return a / gcd(a, b) * b;
  15. }
  16. //时间复杂度O(n^3)
  17. void floyd() {
  18. //枚举跳板(中转点)
  19. for (int k = 1; k <= n; k++) {
  20. //枚举任意两点
  21. for (int i = 1; i <= n; i++) {
  22. for (int j = 1; j <= n; j++) {
  23. if (mindis[i][k] != INF && mindis[k][j] != INF) {
  24. if (mindis[i][k] + mindis[k][j] < mindis[i][j]) {
  25. mindis[i][j] = mindis[i][k] + mindis[k][j];
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }
  32. int main() {
  33. fill(mindis[0], mindis[0] + N * N, INF);
  34. for (int i = 1; i <= n; i++) {
  35. for (int j = max(i - 21, 1); j <= min(i + 21, 2021); j++) {
  36. if (i != j) mindis[i][j] = mindis[j][i] = lcm(i, j);
  37. }
  38. }
  39. //floyd();
  40. //cout << mindis[1][n] << endl;
  41. cout << 10266837 << endl;
  42. return 0;
  43. }

DP 

最长上升子序列
  1. #include<iostream>
  2. using namespace std;
  3. //最长上升子序列-LIS
  4. //1.状态 dp[i] 以第i个元素作为结尾的最长上升子序列的长度
  5. //2.状态转移方程 if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1)
  6. //a 1 2 3 4 5 6 7
  7. // 1 7 3 5 9 4 8
  8. //dp 1 2 3 4 5 6 7
  9. // 1 2 2 3 4 3 4
  10. const int N = 1e3 + 10;
  11. int a[N], dp[N];
  12. int main() {
  13. int n; cin >> n;
  14. for (int i = 1; i <= n; i++) {
  15. cin >> a[i];
  16. dp[i] = 1;//边界,每一个元素自身构成最长上升
  17. }
  18. int mx = 1;
  19. for (int i = 2; i <= n; i++) {
  20. //使用j遍历第i个元素之前的所有元素
  21. for (int j = 1; j < i; j++) {
  22. //找到a[j]和a[i]构成上升的情况
  23. if (a[j] < a[i]) dp[i] = max(dp[i], dp[j] + 1);
  24. }
  25. mx = max(mx, dp[i]);
  26. }
  27. cout << mx << endl;
  28. return 0;
  29. }

STL

List链表(大量的对头尾进行操作时使用)
  1. #include<iostream>
  2. #include<list>
  3. using namespace std;
  4. int main()
  5. {
  6. list<int>ls;
  7. if (!ls.empty())
  8. {
  9. ls.pop_back();//移除列表的最后一个元素
  10. ls.pop_front();//移除列表的第一个元素
  11. }
  12. ls.push_back(10);//列表的末尾添加一个元素
  13. ls.push_front(5);//列表的开头添加一个元素
  14. // 打印列表中的所有元素
  15. for (int elem : ls) {
  16. cout << elem << " ";
  17. }
  18. cout << endl;
  19. return 0;
  20. }
String字符串 
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int main(){
  5. string s1, s2;
  6. getline(cin, s1);
  7. getline(cin, s2);
  8. s1 += s2; // 拼接
  9. if (s1 == s2) { // 比较
  10. cout << "s1 and s2 are equal." << endl;
  11. }
  12. s1 = s2; // 拷贝
  13. //查找子串
  14. if(s1.find(s2)!=-1){
  15. cout<<s2<<" is substr of "<<s1<<endl;
  16. }
  17. while((pos=s1.find(s2,pos))!=-1){
  18. pos++;
  19. cnt++;//统计子串数量
  20. }
  21. reverse(s1.begin(), s1.end()); // 反转s1
  22. // 类型转换示例
  23. string numStr = to_string(123); // 整数转字符串
  24. int num = stoi(s2); // 字符串转整数
  25. double dnum = stod(s2); // 字符串转双精度浮点数
  26. long lnum = stol(s2); // 字符串转长整型
  27. return 0;
  28. }
stack栈
  1. #include<iostream>
  2. #include<stack>
  3. using namespace std;
  4. int main(){
  5. stack<int> st;
  6. int n; cin>>n;
  7. for(int i=1;i<=n;i++){
  8. int x; cin>>x;
  9. st.push(x);
  10. }
  11. while(!st.empty()){
  12. cout<<st.top()<<" ";
  13. st.pop();
  14. }
  15. return 0;
  16. }
queue队列
  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. int main(){
  5. queue<int> q;
  6. int n; cin>>n;
  7. for(int i=1;i<=n;i++){
  8. int x; cin>>x;
  9. q.push(x);
  10. }
  11. while(!q.empty()){
  12. //注意是front()
  13. cout<<q.front()<<" ";
  14. q.pop();
  15. }
  16. return 0;
  17. }
set(去重++排序)
  1. #include<iostream>
  2. #include<set>
  3. using namespace std;
  4. int main(){
  5. set<int> s;
  6. int n; cin>>n;
  7. for(int i=1;i<=n;i++){
  8. int x; cin>>x;
  9. //插入元素用insert
  10. s.insert(x);//底层是红黑树 O(logn)
  11. }
  12. for(auto it:s) cout<<it<<" ";
  13. return 0;
  14. }
map(针对key去重+排序  )
  1. #include<iostream>
  2. #include<map>
  3. using namespace std;
  4. //STL-map
  5. int main(){
  6. map<int,string> mp;
  7. int n; cin>>n;
  8. for(int i=1;i<=n;i++){
  9. int id; string book;
  10. cin>>id>>book;
  11. //map.insert({id,book});
  12. mp[id]=book;
  13. }
  14. for(auto p:mp) cout<<p.first<<" "<<p.second<<endl;
  15. return 0;
  16. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/430168
推荐阅读
相关标签
  

闽ICP备14008679号