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

本文介绍了编程竞赛中的填空题型,包括跑步训练的体力计算、纪念日的分钟统计、REPAT程序的理解、矩阵操作以及整除序列和解码问题的解决方案。通过示例代码展示了如何解决这些题目,涉及到了体力损耗模型、日期计算、程序设计和矩阵数学等概念。
摘要由CSDN通过智能技术生成

题目结构

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

填空题

第一题 跑步训练

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

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

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

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

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

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


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

#include <iostream>
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 <iostream>
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 <iostream>
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 <iostream>
using namespace std;
typedef long long ll;
ll n;
int main()
{
    cin>>n;
    while(n){
        cout<<n<<" ";
        n/=2;
    }
    return 0;
} // namespace std;

第七题 解码

#include <iostream>
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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lydia.na

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值