算法——枚举

枚举算法的介绍:

枚举算法是一种通过列举所有可能解来解决问题的算法。其核心思想是将问题的所有可能答案一一列举,然后根据条件判断这些答案是否合适,保留合适的,舍弃不合适的,就是满足条件的保留,不满足条件的舍去

题目一链接:1.特别数的和 - 蓝桥云课

解题思路:判断每一个数的每一位是否含有2、0、1、9就可以了,可以写一个函数来实现

参考代码:

#include<bits/stdc++.h>
using namespace std;
bool f(int x){
  while(x){
    int y=x%10;
    if(y==2||y==0||y==1||y==9)return true;
    x/=10;
  }
  return false;
}
int main()
{
  int m;
  int ans=0;
  cin>>m;
  for(int i=1;i<=m;i++){
    if(f(i))ans+=i;
  }
  cout<<ans;
  return 0;
}
题目二链接:1.反倍数 - 蓝桥云课

解题思路:这个题目的解题思路和第一题基本一致,不在这里赘述了

参考代码:

#include<bits/stdc++.h>
using namespace std;
bool f(int x,int y,int z,int g){
  if(g%x!=0&&g%y!=0&&g%z!=0){
    return true;
  }
  return false;

}
int main()
{
  int n,a,b,c,num=0;
  cin>>n;
  cin>>a>>b>>c;
  for(int i=1;i<=n;i++){
    if(f(a,b,c,i))num++;
  }
  cout<<num;
  return 0;
}
题目三链接:1.找到最多的数 - 蓝桥云课

解题思路:只要用一个map来存放每个数对应的个数

参考代码:

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int main()
{
  int n,m;
  cin>>n>>m;
  for(int i=1;i<=n*m;i++){//要找的数矩阵没有什么关系,就直接输入也可以
    int x;
    cin>>x;
    mp[x]++;
  }
  for(const auto&[x,y]:mp){
    if(2*y>n*m)cout<<x;//y=2*n/2,这里我们将2乘过去,这样就可以避免有小数
  }
  return 0;
}

算法——模拟

模拟算法的介绍:

这种算法通常涉及到按照题目的要求,一步步地编写代码,模拟题目中描述的过程或操作。模拟算法通常用于解决一些基础的问题,有时被认为是比较简单的“水题”,但实际上,它们也可以非常复杂和具有挑战性。

题目一链接:2.扫雷 - 蓝桥云课

解题思路:二维数组存储地图,遍历每一个位置,特判当前位置由地雷的情况,扫描九宫格更新地雷数量即可

参考代码:我这个代码是把地雷的周围八个位置都模拟了一下,我这个方法比较笨,但是你可以用循环来节省代码,但是我这个比较容易理解,你可以画一个九宫格来辅助理解

#include <iostream>
using namespace std;
const int N=200;
int a[N][N];//全局变量,自定初始化为0
int main()
{
  int n,m;
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
      cin>>a[i][j];

    }
  }
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
      int num=0;
      if(a[i][j]==0){
        if(a[i-1][j-1]==1){
          num++;
        }
        if(a[i-1][j]==1){
          num++;
        }
        if(a[i-1][j+1]==1){
          num++;
        }
        if(a[i][j-1]==1){
          num++;
        }
        if(a[i][j+1]==1){
          num++;
        }
        if(a[i+1][j-1]==1){
          num++;
        }
        if(a[i+1][j]==1){
          num++;
        }
        if(a[i+1][j+1]==1){
          num++;
        }
        cout<<num<<" ";
      }else{
        cout<<9<<" ";
      }

    }
    cout<<endl;
  }

 
  return 0;
}

算法——前缀和

前缀和算法的介绍:

前缀和是一种重要的预处理方式,可以大大降低查询的时间复杂度。前缀和可以简单理解为「数列的前项的和」,即从位置1到位置i这个区间内的所有数字之和。详细的前缀和解释可以参考我文章里专门讲前缀和的文章。

题目一链接:1.区间次方和 - 蓝桥云课

解题思路:先把每个次方的数组都求出来,然后求前缀和

参考代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
long long a[6][N],sum[6][N];// a存储幂次方结果,sum存储前缀和
const long long p=1e9+7;
int main()
{
  int n,m;
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    cin>>a[1][i];// 输入数组a[1][i],即原始数组
  }
   // 计算每个元素的k次方(k从1到5)
  for(int i=2;i<=5;i++){
    for(int j=1;j<=n;j++){
      a[i][j]=(a[i-1][j]*a[1][j])%p;//通过递推公式 a[i][j] = a[i-1][j] * a[1][j] 计算幂次方。
    }
  }
  for(int i=1;i<=5;i++){
    for(int j=1;j<=n;j++){
      sum[i][j]=(sum[i][j-1]+a[i][j])%p;
    }
  }

  while(m--){
    int l,r,k;
    cin>>l>>r>>k;
    cout<<(sum[k][r]-sum[k][l-1]+p)%p<<"\n";// 输出结果,注意加p取模避免负数
  }
  return 0;
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐