备战蓝桥杯——c++基础算法(三)

前言

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≤106 .
对于100% 的评测用例, == 1≤a,b,n≤1018== .

题目分析:

由题可知,该题也需要进行计数,需要进行循环,由于该题的测评用例要到
1018,定义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.对于可以通过数学计算来减少算法时间复杂度时,应采用数学方法。

小结

大家觉得今天题目的难度怎么样呢,你们是否掌握了解题方法和其中包含的算法思维呢?掌握了就去动手练习吧!下期更精彩呦,拜拜~

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值