试题 算法训练 下次上什么课
资源限制
内存限制: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;
}
对于本道题目实际是一道递推题,需要大家根据题目意思仔细推敲。
欢迎大家留言评论,谢谢大家!