蓝桥杯备赛(c++)
这种算法通常涉及到按照题目的要求,一步步地编写代码,模拟题目中描述的过程或操作。模拟算法通常用于解决一些基础的问题,有时被认为是比较简单的“水题”,但实际上,它们也可以非常复杂和具有挑战性。2.扫雷 - 蓝桥云课解题思路:二维数组存储地图,遍历每一个位置,特判当前位置由地雷的情况,扫描九宫格更新地雷数量即可参考代码:我这个代码是把地雷的周围八个位置都模拟了一下,我这个方法比较笨,但是你可以用循环来
算法——枚举
枚举算法的介绍:
枚举算法是一种通过列举所有可能解来解决问题的算法。其核心思想是将问题的所有可能答案一一列举,然后根据条件判断这些答案是否合适,保留合适的,舍弃不合适的,就是满足条件的保留,不满足条件的舍去
题目一链接: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;
}
更多推荐
所有评论(0)