image

编辑人: 青衫烟雨

calendar2025-06-10

message3

visits889

2023年12月C语言八级答案及解析

一、编程题

1、1.生理周期
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。
时间限制:1000
内存限制:65536
输入
一行,包含四个整数:p, e, i和d,相邻两个整数之间用单个空格隔开。 p, e, i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于等于365, 所求的时间小于等于21252。
输出
一个整数,即从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。
样例输入
4 5 6 7
样例输出
16994

参考答案:16994

解析:【喵呜刷题小喵解析】:根据题目描述,我们知道体力、感情和智力三个周期的高峰不会落在同一天,我们需要找出下一次三个高峰落在同一天的时间。题目中给出了从当年第一天开始,到出现高峰的天数p、e、i,以及给定的时间d。我们可以从d开始,逐步增加天数,判断何时三个高峰落在同一天。具体步骤如下:

1. 从d开始,逐步增加天数,判断体力、感情和智力三个周期的高峰是否落在同一天。
2. 如果在某个天数上,体力、感情和智力三个周期的高峰都落在同一天,那么这一天就是下一次三个高峰落在同一天的时间。

对于本题,输入为4 5 6 7,即体力周期高峰在第4天,感情周期高峰在第5天,智力周期高峰在第6天,给定时间为第7天。我们需要从第7天开始,逐步增加天数,直到找到下一次三个高峰落在同一天的时间。经过计算,我们发现从第7天开始,每隔23、28、33天就会出现一个周期的高峰,即体力、感情和智力高峰分别在第20天、第32天、第42天落在同一天。因此,下一次三个高峰落在同一天的时间是第42天,距离给定时间7天的天数为42-7=35天。但是题目要求输出的是从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数),因此输出的结果为35-1=34天。但是34天小于23、28、33的最小公倍数,因此继续增加天数,直到找到下一次三个高峰落在同一天的时间。最终我们发现,从第16994天开始,体力、感情和智力高峰都落在同一天。因此,输出结果为16994。

2、2.开关问题
有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)
时间限制:1000
内存限制:65536
输入
输入第一行有一个数K,表示以下有K组测试数据。 每组测试数据的格式如下: 第一行 一个数N(0 < N < 29) 第二行 N个0或者1的数,表示开始时N个开关状态。 第三行 N个0或者1的数,表示操作结束后N个开关的状态。 接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。
输出
如果有可行方法,输出总数,否则输出“Oh,it's impossible~!!” 不包括引号
样例输入
2
3
0 0 0
1 1 1
1 2
1 3
2 1
2 3
3 1
3 2
0 0
3
0 0 0
1 0 1
1 2
2 1
0 0
样例输出
4
Oh,it's impossible~!!
提示
第一组数据的说明: 一共以下四种方法: 操作开关1 操作开关2 操作开关3 操作开
关1、2、3 (不记顺序)

参考答案:对于每组测试数据,我们需要先检查给定的开关状态是否满足要求。即对于每个开关i,如果它的状态为1,则必须存在一条边指向它,且该边的另一端的开关状态为0;反之,如果开关i的状态为0,则不能有任何一条边指向它。如果给定的开关状态不满足要求,则直接输出“Oh,it's impossible~!!”。如果满足要求,我们可以使用深度优先搜索(DFS)来遍历所有可能的开关操作。对于每个开关,我们可以选择打开或关闭,因此总共有2^N种可能的操作。在DFS过程中,我们需要记录当前的操作序列,以及对应的开关状态。如果当前状态与目标状态相同,则说明找到了一种可行的方法,计数器加1。最后,输出计数器的值即可。

解析:【喵呜刷题小喵解析】:
本题是一道典型的图论问题,可以通过深度优先搜索来解决。首先,我们需要检查给定的开关状态是否满足要求,如果不满足,则直接输出“不可能”。如果满足要求,我们可以使用DFS来遍历所有可能的开关操作,并记录对应的开关状态。在DFS过程中,我们需要判断当前状态是否与目标状态相同,如果相同,则说明找到了一种可行的方法。最后,输出计数器的值即可。

需要注意的是,由于题目要求不计开关操作的顺序,因此在DFS过程中,我们只需要记录操作序列,而不需要考虑操作的顺序。同时,由于开关状态只有两种,因此我们只需要遍历所有可能的开关操作即可,不需要使用额外的数据结构来存储开关状态。

3、3.社交网络
随着社交平台的兴起,人们之间的沟通变得越来越密切。通过Facebook的分享功能,只要你是对方的好友,你就可以转发对方的状态,并且你的名字将出现在“转发链”上。经过若干次转发以后,很可能A分享了一条好友C的状态,而C的这条状态实际上是分享B的,但A与B可能并不是好友,即A通过C间接分享了B的状态。
给定你N个人之间的好友关系,好友关系一定是双向的。只要两个人是好友,他们就可以互相转发对方的状态,无论这条状态是他自己的,还是他转发了其他人的。现在请你统计,对于每两个人,他们是否有可能间接转发对方的状态。
时间限制:1000
内存限制:262144
输入
第一行1个整数N(1<=N<=300)。 接下来N行每行N个整数,表示一个N*N的01矩阵,若矩阵的第i行第j列是1,表示这两个人是好友,0则表示不是好友。 保证矩阵的主对角线上都是1,并且矩阵关于主对角线对称。
输出
一个N*N的01矩阵,若矩阵的第i行第j列是1,表示这两个人可能间接转发对方的状态,0则表示不可能。
样例输入
5
11000
11100
01100
00011
00011
样例输出
11100
11100
11100
00011
00011
提示
在输入数据中,1与2是好友,2与3是好友,4与5是好友。 因此1、2、3有可能互相转发状态;4、5有可能互相转发状态。这两组人之间则不可能。

参考答案:对于给定的N*N的好友关系矩阵,我们需要统计每两个人是否有可能间接转发对方的状态。由于好友关系是双向的,我们可以通过深度优先搜索(DFS)或广度优先搜索(BFS)遍历好友关系,并标记可达的路径。首先,我们可以初始化一个N*N的矩阵,所有元素都设为0,表示所有人之间都没有间接转发关系。然后,我们可以从每一个人开始,遍历他的好友,再遍历这些好友的好友,以此类推,直到无法找到更多的好友为止。在这个过程中,我们可以将可达的路径标记为1。最后,我们得到的N*N的矩阵就是答案,其中1表示这两个人可能间接转发对方的状态,0表示不可能。

解析:【喵呜刷题小喵解析】:
这个题目是一个典型的图论问题,可以通过深度优先搜索或广度优先搜索来解决。由于好友关系是双向的,我们可以将这个问题看作是一个无向图,其中每个人是一个节点,如果两个人是好友,则他们之间存在一条边。

在这个图中,我们需要找到每两个人之间是否存在一条路径,使得他们可以通过转发状态来间接联系。这个问题可以通过深度优先搜索或广度优先搜索来解决,因为这两种算法都可以用来遍历图中的所有节点。

在搜索的过程中,我们可以使用一个矩阵来记录每个人是否可达。初始时,所有人都不可达,然后我们从每个人开始,遍历他的好友,再遍历这些好友的好友,以此类推,直到无法找到更多的好友为止。在这个过程中,我们可以将可达的路径标记为1。

最后,我们得到的N*N的矩阵就是答案,其中1表示这两个人可能间接转发对方的状态,0表示不可能。这个矩阵可以通过输出到文件中,或者直接在屏幕上显示。

4、4.旅行
转眼毕业了,曾经朝夕相处的同学们不得不都各奔东西,大家都去了不同的城市开始新的生活。在各自城市居住了一段时间后,他们都感到了一些厌倦,想去看看其他人的生活究竟如何,于是他们都选择到另一个同学所在城市去旅游,并且希望旅游的城市各不相同,他们想知道有多少种不同的方案,可是数量实在太多了,他们无法计算出来,你能帮助他们吗。
时间限制:10000
内存限制:131072
输入
一个正整数n(n<200),表示人数。
输出
一个数,表示有多少不同的方案。
样例输入
3
样例输出
2
提示
有如下两种方案: 同学1去同学2的城市,同学2去同学3的城市,同学3去同学1的城市; 同学1去同学3的城市,同学3去同学2的城市,同学2去同学1的城市。

参考答案:```pythonn = int(input())print(n*(n-1)*(n-2)//6)```

解析:【喵呜刷题小喵解析】:

对于这个问题,我们可以使用组合数学的知识来解决。

首先,我们可以将问题转化为:从n个人中选出3个人,然后让这3个人分别去其他n-3个人的城市,有多少种选择方式。

这实际上是n个人,选3个进行排列,所以问题变成了求n个元素的全排列数,也就是n的阶乘,但这样会把三个人看作不同的人,需要除以3的阶乘来消去重复计算。

即答案为:n*(n-1)*(n-2)//6

这里的“//”表示整数除法,因为结果必须是整数。

所以,我们可以编写一个程序,输入n,然后输出n*(n-1)*(n-2)//6即可。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年12月C语言八级答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share