蓝桥杯赛前冲刺30天打卡题解(Day4)

1.奇数倍数

蓝桥杯赛前冲刺30天打卡题解(Day4)_第1张图片 

思路: 从小到大枚举所有2019的整数倍数,判断枚举数的每一位是否为奇数,返回第一个满足条件的数。

#include 
using namespace std;
int main()
{
  int a=2019,b=0,c=0;
  for(int i=1;;i++)
  {
    b=0;c=0;
    int bz=1;
    c=a*i;
    while(c!=0)
    {
      b=c%10;
      c=c/10;
      if(b%2==0) bz=0;
    }
    if(bz==1) {cout<

 2.第几个幸运数字

蓝桥杯赛前冲刺30天打卡题解(Day4)_第2张图片

思路: 

方法有很多,能够使用最小堆解题,时间复杂度是O ( n l g n ) O(n lgn)O(nlgn),其中n代表所求数字时第n 个幸运数字。不过这里我推荐使用三指针+动态规划的做法,具体方法如下:

定义数组数组d p dpdp从小到大存储所有的幸运数字,我们知道幸运数字一定是只有3 、 5 、 7 为因子的数字,因此任意一个幸运数字一定能够将其乘以3 、 5 、 7 ,得到新的幸运数字,也就是说幸运数字一定能够由比它小的幸运数字乘以3 或 5 或 7推算出来。
 

那么既然这样对于第i ii位的幸运数字究竟由哪一位推算出来呢?此时可以定义i d x 3   i d x 5   i d x 7 idx3 ~idx5 ~idx7 分别存储供应位,表示该位的值提供新的幸运数字,提供的幸运数字分别是d p [ i d x 3 ] ∗ 3 , d p [ i d x 5 ] ∗ 5 , d p [ i d x 7 ] ∗ 7 。开始时值都为0,d p [ 0 ] =1,此时提供幸运数字分别是:

1∗3=3

1∗5=5

1∗7=7

获取这三位供应幸运数字的最小值,就是当前位上的幸运数字,如果当前位上的幸运数字大于等于某一个供应位提供的幸运数字,那么表示该位供应的幸运数字已经出现在数组中,该供应位向后移动一位。

循环直到出现最小值也就是当前位幸运数字与所求相等时,返回当前位数i 。时间复杂度:O ( N ) 

#include
using namespace std; 
int main()
{ 
    long long n = 59084709587505;
    int ans = 0;
    for(long long i = 1; i <= n; i *= 3) 
    {
        for(long long j = 1; i*j <= n; j *= 5)
        {
            for(long long k = 1; k*i*j <= n; k *= 7)
            {
                ans++;
            }
        }
    }
    cout << ans - 1;
    return 0;
}

3.四平方和 

蓝桥杯赛前冲刺30天打卡题解(Day4)_第3张图片 

方法1:暴力

#include 
#include 
using namespace std;
int main(){
    int n;
    scanf("%d",&n);
    for(int a=0;a*a<=n;a++){
        for(int b=a;a*a+b*b<=n;b++){
            for(int c=b;a*a+b*b+c*c<=n;c++){
                int t=n-a*a-b*b-c*c;
                int d=sqrt(t);
                if(d*d==t){
                    printf("%d %d %d %d",a,b,c,d);
                    return 0;
                }
            }
        }
    }
    return 0;
}

 PS:时间复杂不符合要求。故换第二种方法

 方法2:二分
时间复杂度:O(n2 logn)

 

#include 
#include 
#include 
using namespace std;
const int N=5*1e6+10;
bool g[N];
struct Sum{
    int s,c,d;
    bool operator <(const Sum& t)const{
        if(s!=t.s)return s=t)r=mid;
                else l=mid+1;
            }
            if(sum[l].s==t){
                printf("%d %d %d %d",a,b,sum[l].c,sum[l].d);
                return 0;
            }
        }
    }
    return 0;
}

4.迷宫 

 蓝桥杯赛前冲刺30天打卡题解(Day4)_第4张图片

蓝桥杯赛前冲刺30天打卡题解(Day4)_第5张图片 

#include 
#include 
using namespace std;
const int N=33,M=53;
char g[N][M];
typedef pairPII;
vectorans;
PII que[N*M];
int hh=0,tt=-1;
PII pre[N][M];
void bfs(){
  int dx[4]={1,0,0,-1},dy[4]={0,-1,1,0};
  que[++tt]={0,0};

  while(hh<=tt){
    auto t=que[hh++];
    for(int i=0;i<4;i++){
      int x=dx[i]+t.first;
      int y=dy[i]+t.second;

      if(g[x][y]=='0'&&x>=0&&x<30&&y>=0&&y<50){
     
        que[++tt]={x,y};
        pre[x][y]=t;
        g[x][y]='1';
      }
    }
  }

  int x=29,y=49;
  int prex,prey;
  while(x||y){

    auto t=pre[x][y];
    prex=t.first;
    prey=t.second;

    if(x-prex==1){
      ans.push_back('D');
    }else if(x-prex==-1){
      ans.push_back('U');
    }else if(y-prey==1){
      ans.push_back('R');
    }else if(y-prey==-1){
      ans.push_back('L');
    }
    x=prex;
    y=prey;
  }

int main()
{

  for(int i=0;i<30;i++){
    for(int j=0;j<50;j++){
      scanf("%c",&g[i][j]);
    }
    getchar();
  }

    bfs();
   
      for(int i=ans.size()-1;i>=0;i--){
        printf("%c",ans[i]);
      }
  return 0;
}

 

 

你可能感兴趣的:(C++,蓝桥杯,蓝桥杯,c++,算法,c语言,开发语言)