蓝桥杯 试题 算法训练 下次上什么课

试题 算法训练 下次上什么课

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  CST的上课方式有四种,BOSS上课、小红上课、自己做题或考试。
  (1)如果这次是BOSS向上课,那么下次会是小红上课或考试。
  (2)如果这次是小红上课,那么下次会是自己做题。
  (3)如果这次是自己做题,那么下次会是小红上课或BOSS向上课
  (4)如果这次是考试,那么下次会是自己做题或BOSS向上课。
  上述“或”表示二者出现的可能性相同

输入格式

  第一排输入2个数据H、T,H=1表示这次是BOSS向上课,H=2表示这次是小红上课,H=3表示这次是自己做题,H=4表示这次是考试。

输出格式

  输出2个数据P、S,p为T次课后最有可能上的课的编号H(若可能性一样输出编号H小的),S为T次课后一共有多少种可能。例:输出1行,包含一个整数,表示矩阵中所有元素的和。

样例输入

3 4

样例输出

2 9

数据规模和约定

  1〈=T〈=25

首先我们来分析一下样例输入和输出,为了分析时简单一单,并且可分析至代码中:

我们假设BOSS上课、小红上课、自己做题或考试分别为数字1,2,3,4,首先我们输入3代表第一节课为自己做题,接着输入4代表接下来要求第4节课后的最有可能上课编号和可能总数,这里本人就将具体分析写到纸上了:

具体分析如下:

 

 

 以上就是对样例输入输出的分析了(字丑勿怪),大家自己理解一下,接下来为代码展示:

具体代码如下:

#include <iostream>
using namespace std;
int h,t,sum=0;//h表示第一节课上什么课,t代表求t次课后,sum用于记录一共有多少种可能
//h=1表示这次是BOSS向上课,h=2表示这次是小红上课,h=3表示这次是自己做题,h=4表示这次是考试。
int a[5]={0};//a数组中的第一个、第二个、第三个、第四个元素(从第0个开始),分别记录第t次课后课上四种上课方式各自出现的次数
void fact(int m,int l)//m为当前上课方式,l为当前为第l次课
{
	if(l==t)//如果l=t,那么就顺利到了最后一节课,此时sum加一,并让其对应上课方式次数加1
	{
		sum++;
		a[m]++;
		return ;
	}//if语句中的fact左侧为下节课上课方式,右侧代表了下节课是第几节课
	if(m==1)//1后面只能接2或4
	{
		fact(2,l+1);
		fact(4,l+1);
	}
	else if(m==2)//2后面只能接3
	{
		fact(3,l+1);
	}
	else if(m==3)//3后面能接2或1
	{
		fact(2,l+1);
		fact(1,l+1);
	}
	else if(m==4)//4后面能接3或1
	{
		fact(3,l+1);
		fact(1,l+1);
	}
}
int main()
{
	cin>>h>>t;
	fact(h,0);
	int max=1;
	for(int i=2;i<=4;i++)
	{
		if(a[max]<a[i])
		{
			max=i;
		}
	}
	cout<<max<<" "<<sum;
	return 0;
}

对于本道题目实际是一道递推题,需要大家根据题目意思仔细推敲。

欢迎大家留言评论,谢谢大家!                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值