【蓝桥杯备赛】2020年第十一届蓝桥杯省赛第一场(7月5日)真题C++ B组 未完待续……

文章目录

  • 题目结构
  • 填空题
    • 第一题 跑步训练
    • 第二题 纪念日
    • 第四题 REPAT程序
    • 第五题 矩阵
    • 第六题 整除序列
    • 第七题 解码

题目结构

项目 题型 分值 题型
第一题 结果填空 5 模拟
第二题 结果填空 5
第三题 结果填空 10
第四题 结果填空 10
第五题 结果填空 15
第六题 程序设计 15
第七题 程序设计 20
第八题 程序设计 20
第九题 程序设计 25
第十题 程序设计 25

填空题

第一题 跑步训练

问题描述
小明要做一个跑步训练,初始时,小明充满体力,体力值计为 10000。

如果小明跑步,每分钟损耗 600 的体力。
如果小明休息,每分钟增加 300 的体力。
体力的损耗和增加都是 均匀变化的。

小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。

如果某个时刻小明的体力到达 0,他就停止锻炼, 请问小明在多久后停止锻炼。

为了使答案为整数,请以秒为单位输出答案,答案中只填写数,不填写单位。

答案提交
这是一道结果填空题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


每分钟损耗600的体力的话,每秒钟损耗10的体力,当体力不足600时,剩余多少体力就损耗多少,到不了600。

#include 
using namespace std;
int main()
{
  int n=10000;
  int t=0;
  while(n){
    if(n>600){
      n-=600;
      t+=60;
      n+=300;
      t+=60;
    }else{
      t+=n/10;
      break;
    }
  }
  cout<<t<<endl;
} // namespace std;

第二题 纪念日

问题描述
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?

方便解法

代码实现

/* 问题描述
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?

 */
#include 
using namespace std;
int day1,day2,day3;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap(int year){
  if(year%400==0||(year%4==0&&year%100!=0))return true;
  else return false;
}
int get_days(int year,int month){
  if(month==2){
    return 28+is_leap(year);
  }
  else{
    return days[month];
  }
}
int main()
{
  //从1921/7/24到1921/12/31的天数
  int day1=8+31+30+31+30+31;
  //从2020/1/1到2020/6/31的天数
  int day2=31+28+31+30+31+31;
  //从1922/1/1到2019/12/31的天数
  for(int i=1922;i<=2019;i++){
    for(int j=1;j<=12;j++){
      day3+=get_days(i,j);
    }
  }
  cout<<day1<<endl;
  cout<<day2<<endl;
  cout<<day3<<endl;
  cout<<(day1+day2+day3+1)*24*60<<endl;
} // namespace std;

excel数天数的话记得最后加1

第四题 REPAT程序

题目描述
cpp代码确实不好实现。用python吧。

  1. 将代码复制到word
  2. REPEAT替换为for i in range(
  3. :替换为):
  4. 打开idle
  5. ctrl+n新建一个python文件
  6. 运行得到结果

答案:241830


第五题 矩阵

问题描述
把 1 ∼ 2020 放在 2 × 1010 的矩阵里。

要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?

答案很大,你只需要给出方案数除以 2020 的余数即可。


如果要放置的话一定要从最左边开始放,并且是先是第一行的最左边,再放第二行的最左边。
确定状态转移量dp[i][j]其中i是第一行所放数的个数,j是第二行所放数的个数.
数放第一行的时候的时候,dp[i][j]+=dp[i-1][j]
数放第二行的时候的时候,dp[i][j]+=dp[i][j-1]

#include 
using namespace std;

int f[1020][1020];

int main()
{
    f[0][0] = 1;                                   // 两行一个数字都不放,也是一种方案
    for (int i = 0; i <= 1010; i ++)
        for (int j = 0; j <= i; j ++)
        {
            if(i - 1 >= j)                         // 转移前的状态也要合法,即第一行的数量不小于第二行的数量
            	f[i][j] += f[i - 1][j] % 2020;
            if(j - 1 >= 0)
            	f[i][j] += f[i][j - 1] % 2020;
        }
        
    cout << f[1010][1010] << endl;   
    return 0;
}


答案:1340


第六题 整除序列

#include 
using namespace std;
typedef long long ll;
ll n;
int main()
{
    cin>>n;
    while(n){
        cout<<n<<" ";
        n/=2;
    }
    return 0;
} // namespace std;

第七题 解码

#include 
using namespace std;
int main()
{
    string s;
    cin>>s;
    int len=s.size();
    cout<<s[0];
    for(int i=1;i<len;i++){
        if(s[i]>'0'&&s[i]<='9'){
            for(int j=1;j<s[i]-'0';j++){
                cout<<s[i-1];
            }
        }
        else{
            cout<<s[i];
        }
    }
    return 0;
} // namespace std;

你可能感兴趣的:(蓝桥杯,c++,蓝桥杯,算法)