北理工乐学H:洗牌(选作)

H:洗牌(选作)

成绩5开启时间2022年11月21日 星期一 08:00
折扣0.8折扣时间2022年12月31日 星期六 23:55
允许迟交关闭时间2022年12月31日 星期六 23:55

假设我们有 2n 张牌,它们以 1, 2, ..., n, n+1, ..., 2n 编号并在开始时保持着这种顺序。一次洗牌就是将牌原来的次序变为 n+1, 1, n+2, 2, ..., 2n, n,也就是将原来的前 n 张牌放到位置 2, 4, ..., 2n,并且将余下的 n 张牌按照他们原来的次序放到奇数位置 1, 3, ..., 2n-1。已经证明对于任何一个自然数 n,这 2n 张牌经过一定次数的洗牌就回到原来的次序。但我们不知道对于一个特定的 n,需要几次洗牌才能将牌洗回原来的次序。

输入:
牌张数的一半n,即初始情况下一共有2n张牌,n为int型整数

输出:
将牌洗回原来的次序所需要的洗牌次数

 测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1以文本方式显示
  1. 10↵
以文本方式显示
  1. 6↵
1秒64M0
测试用例 2以文本方式显示
  1. 20↵
以文本方式显示
  1. 20↵
1秒64M0
测试用例 3以文本方式显示
  1. 3↵
以文本方式显示
  1. 3↵
1秒64M0
测试用例 4以文本方式显示
  1. 30↵
以文本方式显示
  1. 60↵
1秒64M0
测试用例 5以文本方式显示
  1. 1↵
以文本方式显示
  1. 2↵
1秒64M0
测试用例 6以文本方式显示
  1. 10000↵
以文本方式显示
  1. 812↵
1秒64M0
测试用例 7以文本方式显示
  1. 4500↵
以文本方式显示
  1. 2250↵
1秒64M0

第一种方法:将所有牌视作一个数组,将牌数初始化为牌的位置,对所有牌进行变换直到复原。

int main(void)
{
	int n, cnt = 0;
	scanf("%d", &n);
	int *brand1, *brand2;
	brand1 = (int*)malloc((2 * n + 1) * sizeof(int));
	brand2 = (int*)malloc((2 * n + 1) * sizeof(int));
	/*动态数组*/

	for (int i = 1; i <= 2 * n; i++)
		brand1[i] = i;/*初始化*/

	do{
		cnt++;
		for (int i = 1; i <= n; i++)/*一次洗牌*/
		{
			brand2[2 * i] = brand1[i];
			brand2[2 * i - 1] = brand1[n + i];
		}
		memcpy(brand1, brand2, (2 * n + 1) * sizeof(int));
		/*滚动数组思想*/
	} while (brand1[1] != 1);

	free(brand1);
	free(brand2);
	printf("%d\n", cnt);

	return 0;
}

*注:动态数组在数组大小受变量影响时(尤其是这题的情况,数组大小可以很小,也可以很大)很好用,否则至少要写成brand[20001],很占用空间。

第二种方法:只考虑一张牌的位置,只要最后这一张牌回到原位即可。显然这种方法运行更快,占用内存少得多。

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d",&n);
	int count = 0;
	for (int i = 1; i <= 2*n; count++)
	{
		if (i < n + 1)
			i *= 2;
		else
			i=(i - n)*2-1;
			
		if (i == 1)
			break;
	}
	printf("%d\n", ++count);
	return 0;
}

本人C语言菜鸟一枚,代码不当或可以改进的地方欢迎大家讨论交流。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
北京理工大学成立于1940年,是中国一所以工科为主、工、理、管、文、法等多学科协调发展的综合性大学。乐学作业是北京理工大学的一种独特教育理念,强调学生在学习过程中的快乐体验和有效成果。 乐学作业的核心理念是让学生从传统的单一教学模式中解放出来,培养积极主动的学习态度和兴趣。同乐学作业也倡导理论与实践相结合,鼓励学生动手实践,锻炼解决问题的能力。 在乐学作业中,学生可以根据自己的兴趣和特长选择适合自己的课程和项目。学校提供了丰富的学科和专业,包括工程、科学、管理、文学、法学等多个领域。学生可以通过多种途径获取知识,例如课堂教学、实验研究、社会实践等。 乐学作业的教学方法也非常灵活多样。老师会根据学生特点和需求提供个性化指导,帮助学生克服学习困难。同,学生在团队合作中也可以相互学习、相互促进。学校还注重培养学生的创新思维和实践能力,鼓励学生进行创新性的研究和项目实践。 乐学作业的目的是培养具备批判性思维、创新意识和实践能力的综合型人才。在这种教育理念下,学生可以更主动地参与学习,享受到学习的乐趣,并且能够更好地适应社会的发展和变化。 作为一所享有盛誉的高校,北京理工大学的乐学作业模式不仅在国内受到关注和推崇,也赢得了国际上的广泛认可。它为学生提供了全面的教育平台,培养了一批才华横溢的年轻人,为社会的进步和发展做出了重要贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值