蓝桥杯算法训练 - day1

156 阅读3分钟

​持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

 马虎的算式

题目描述

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

有一次,老师出的题目是:36 x 495 = ?36x495=?

他却给抄成了:396 x 45 = ?396x45=?

但结果却很戏剧性,他的答案竟然是对的!!

因为 36 * 495 = 396 * 45 = 1782036∗495=396∗45=17820。

类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 5427∗594=297∗54。

假设 a\ b\ c\ d\ ea b c d e 代表 11 ~ 99 不同的 55 个数字(注意是各不相同的数字,且不含 00 )

能满足形如: ab * cde = adb * ceab∗cde=adb∗ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码

#include <iostream>
using namespace std;
int main()
{
  int ans = 0;
  for(int a = 1; a < 10;a ++){
    for(int b =1;b < 10;b ++){
      if(a != b){
        for(int c = 1; c < 10;c++){
          if(c != a && c != b){
            for(int d = 1;d < 10 ;d++){
              if(d != a && d != c && d != b ){
                for(int e = 1; e < 10 ;e ++){
                  if(e != a &&e != b && e != c && e != d){
                    if((a*10 + b) * (c*100 + d * 10 + e)  == (a *100 + d*10 + b) *(c*10 +e))
                        ans++;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  cout<<ans;
}

 思路

 枚举比较简单不说了


跑步锻炼

题目描述

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。

小蓝跑步已经坚持了很长时间,从 20002000 年 11 月 11 日周六(含)到 20202020 年 1010 月 11 日周四(含)。请问这段时间小蓝总共跑步多少千米?

代码 

#include <iostream>
using namespace std;
long long sum = 0;
bool isleap(int y){
  return (y%4==0 &&y%100!=0) || (y%400 == 0);
}
int main()
{
  // 请在此输入您的代码
     int y = 2000,m = 1,d = 1,s = 6;
     while(!(y == 2020 && m == 1 && d == 1)){
     
     if(d == 1 || s%7 == 6 )
     {
       sum += 2;            
     }
     else sum += 1;
     
     s++;          

     if(m == 12 && d == 32){
       y ++;
       m = 1;
       d = 1; 
       
     }
     else if((m == 1 ||m == 3 || m== 5||m == 7|| m == 8 || m ==10) && (d == 32)){
       m++;
       d = 1; 
       
     }
     else if(m == 2&&isleap(y) && d == 30){
        m ++; 
        d = 1; 
     }
     else if(m == 2&&!isleap(y) && d == 29){
        m ++;
        d = 1;
     }
     else if((m == 4 || m == 6 || m == 9 || m == 11) && d == 31){
        m++;
        d = 1;
      
     }
	 else d++;
     
     
  }
  cout<<sum;
  return 0;
}

思路

这题我最开始的时候,while() 条件判断失误,我把条件写成 while(y!= 2020 && m != 1 && d != 1)  


第39阶台阶

题目描述

小明刚刚看完电影《第 3939 级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是 3939 级!

站在台阶前,他突然又想着一个问题:

如果我每一步只能迈上 11 个或 22 个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完 3939 级台阶,有多少种不同的上法呢?

请你利用计算机的优势,帮助小明寻找答案。

代码

#include <iostream>
using namespace std;
int ans ;   //方法数
void f (int n, int step )  //  n 为剩余的阶梯数,step 为已走的步数
{ 
   if(n < 0)
    return;
   if(n == 0 && step % 2 ==0) ans ++;
   f(n - 1,step + 1);    // 每次走一个阶梯,一次走一步
   f(n - 2 ,step + 1);   // 每次走俩个阶梯, 一次走一步
}
int main()
{
  f(39,0);
  cout<<ans<<endl;
  return 0;
}

思路

如果不告诉你,这个需要偶数步,只告诉你一次走俩步或者一步,那么该如何走呢? 很简单就是

f(n =39){

    return f (n - 1) + f(n - 2)

}