前言
Hi,小伙伴们大家好,我是阿冰!继上一篇文章
备战蓝桥杯——c++基础算法(二)
后,这里会继续进行c++基础算法的学习,好,那我们开始今天的学习吧~
正文
下面我们会学习两道真题,分别是跑步锻炼和刷题统计,比之前的题目要难一些,不过相信在大家的共同努力下一定会攻克的!!!
1.跑步锻炼
真题再现:
原题请点击这里~
题目描述
本题为
填空题
,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝每天都锻炼身体。正常情况下,小蓝每天跑 1 千米。如果某天是
周一或者月初(1 日)
,为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
题目分析:
这道题是填空题,不过由于时间跨度大,需要使用编程进行解决。题目的意思也很好理解,需要计算小蓝在这段时间内所跑的千米数,我们可以定义年月日周,然后根据条件进行自增,直到截止日期为止,对千米进行累加计算,由此,我们可以用循环,本题采用while循环。
涉及到年月日这类的日期判断,我们就需要判断平年闰年,由此判断出二月的天数;同时,每月份的天数我们可以定义一个数组,如下:
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
该数组中包含13个元素,第一个即days[0]=0,从下标为1时是一月份的天数,这样就保证了下边和月份的一致,使算法更高效。
参考代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap(int y)
{
return y%400==0||y%4==0&&y%100!=0;
}
int daysofmonth(int y,int m)
{
if(m==2)
return 28+is_leap(y);
else
return days[m];
}
int main()
{
int y=2000,m=1,d=1,w=6;
int res=0;
while(y!=2020||m!=10||d!=2)
{
if(w==1||d==1)
res+=2;
else
res++;
d++;
if(d>daysofmonth(y,m))
d=1,m++;
if(m>12)
m=1,y++;
w++;
if(w>7)
w=1;
}
cout<<res<<endl;
return 0;
}
题目总结:
1.凡是涉及到这种年月日日期的题目,需要判断平年闰年,代码如下:
int is_leap(int y)
{
return y%400==0||y%4==0&&y%100!=0;
}
2.涉及到月份天数的题目可以定义有13个元素的数组,保证数组下标和月份保持一致。
3.遇到复杂的题目,可以将题目一段一段的分开写,会容易很多。比如这道题,刚看到的时候可能会被它吼住,但是当看到年月日我们就判断平年闰年,涉及到月份天数就定义数组,有时间跨度就定义计数器进行自增,题目迎刃而解!
2.刷题统计
真题再现:
原题请点击这里~
问题描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数 a,b 和 n.
输出格式
输出一个整数代表天数。
样例输入
10 20 99
样例输出
8
评测用例规模与约定
对于 50% 的评测用例, 1≤a,b,n≤10
6
.
对于100% 的评测用例, == 1≤a,b,n≤10
18
== .
题目分析:
由题可知,该题也需要进行计数,需要进行循环,由于该题的测评用例要到
10
18
,定义int空间是不够的,需要定义long long型,用来存储a,b,n;如果暴力解题,完全用循环来计算出天数,时间复杂度太大,此时,我们可以用数学方法先计算出一周所刷的题数,然后用n除以一周的题数就是刷题所需要的整周数,在乘7就是所需的整周天数,再用n除以一周所刷题数求余就求出所剩的题数,具体代码如下:
LL s=a*5+b*2;
LL cnt=0;
cnt+=n/s*7;
n%=s;
做好这些准备工作后,再进入循环,如下:
for(int i=1;i<=7;i++)
{
if(n<=0)
break;
if(i<=5)
n-=a;
else
n-=b;
cnt++;
}
即可求出天数。
参考代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL a,b,n;
cin>>a>>b>>n;
LL s=a*5+b*2;
LL cnt=0;
cnt+=n/s*7;
n%=s;
for(int i=1;i<=7;i++)
{
if(n<=0)
break;
if(i<=5)
n-=a;
else
n-=b;
cnt++;
}
cout<<cnt<<endl;
return 0;
}
题目总结:
1.对于空间大于一个int型的大小时,可以定义更大空间的变量。
2.对于可以通过数学计算来减少算法时间复杂度时,应采用数学方法。
小结
大家觉得今天题目的难度怎么样呢,你们是否掌握了解题方法和其中包含的算法思维呢?掌握了就去动手练习吧!下期更精彩呦,拜拜~