问题 1225: 文科生的悲哀

时间限制: 1Sec 内存限制: 128MB

题目描述

化学不及格的Matrix67无奈选择了文科。他必须硬着头皮准备一次又一次的文科考试。
在这一学期一共有n次文科考试,考试科目有4种,分别为政治、历史、地理和综合。每次考哪一科是不定的,因此在考试前Matrix67不知道应该 去复习哪一科的功课。他希望能预测出下一次可能考的科目。于是,他收集到了以往的文科考试的资料。从以往的考试中,他发现了这样几个规律:
1.如果这次考的是政治,那么下一次一定会考历史;
2.如果这次考的是综合,那么下一次一定会考地理;
3.如果这次考的是历史,那么下一次要么考政治,要么考地理;
4.如果这次考的是地理,那么下一次要么考历史,要么考综合。
Matrix67已经知道,本学期的第一次考试科目为政治。他打算拟定一个可以应对所有可能情况的应考复习计划。因此,他想知道,整个学期有多少种可能的考试科目安排满足以上规律。你能帮他算出来吗?

输入
一个正整数n,代表本学期总的考试次数。(输入数据保证n<=10000)

输出
一个正整数,表示符合规律的科目安排方案的总数。
考虑到这个结果可能会很大,因此你只需要输出它mod 7654321的值即可。

样例输入
5
样例输出
5

Code

Code: Queue --> 斐波那契数列

使用的是队列

化用代码:
政治	1			历史	2
地理	3			综合	4
1-->2				4-->3
2-->1/3				3-->2/4
-----------------n=5分布树---------------------------
1				1
2				2
3		1				3
4		2			2		4
5	1		3	1		3	3
一共有	12121	12123	12321	12323	12343五种情况
----------------队列的情况----------------------------
1	2	3	4	5	6	7	8	9	10	11	12
1	2	1	3	2	2	4	1	3	1	3	3
1	2	3		4			5
time	1	2	3	4	5 
base	1	2	3	5	8
rear	2	3	5	8	13
----------------------枚举----------------------------
n	time
1	1
2	1
3	2
4	3
5	5
6	8
7	13
----------------------规律----------------------------
a[n]=a[n-1]+a[n-2]

代码为:

#include<stdio.h>
#define INN 7654321
int ia[10001]={0,1,1,2};
int main()
{
	int n,i;
	scanf("%d", &n);
	for(i=3;i<=n;i++){
		ia[i]=(ia[i-1]+ia[i-2])%INN;
	}
	printf("%d\n", ia[n]);
}

使用队列测得前面多项的代码

#include<stdio.h>
#define INN 7654321
int queue[50000]={0};
int main()
{
	int n=10,i,base,rear,front,cnt;
	queue[1]=1;
	base=1;		rear=2;		front=1;//初始化
	for(i=1;i<n;i++){
		base=rear;//当前最新的情况的结束位置
		while(front<base){//将上一次产生的情况排列出来
			if(queue[front]==1){
				queue[rear++] = 2;
				front++;
			}
			else if(queue[front]==2){
				queue[rear++] = 1;
				queue[rear++] = 3;
				front++;
			}
			else if(queue[front]==3){
				queue[rear++] = 2;
				queue[rear++] = 4;
				front++;
			}
			else if(queue[front]==4){
				queue[rear++] = 3;
				front++;
			}
		}//结束时,front=base,rear到达一个新的值,rear-1为当前情况的最后位置
		cnt=rear-base;//当前的最后位置和上一次的最后位置之差
		printf("%-2d:  %d\n", i, cnt);
	}
	return 0;
}

傻逼的我把4的目标变为了1,而不是3,服了~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值