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秒 64M 0
测试用例 2 以文本方式显示

  1. 20↵
以文本方式显示

  1. 20↵
1秒 64M 0
测试用例 3 以文本方式显示

  1. 3↵
以文本方式显示

  1. 3↵
1秒 64M 0
测试用例 4 以文本方式显示

  1. 30↵
以文本方式显示

  1. 60↵
1秒 64M 0
测试用例 5 以文本方式显示

  1. 1↵
以文本方式显示

  1. 2↵
1秒 64M 0
测试用例 6 以文本方式显示

  1. 10000↵
以文本方式显示

  1. 812↵
1秒 64M 0
测试用例 7 以文本方式显示

  1. 4500↵
以文本方式显示

  1. 2250↵
1秒 64M 0

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

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;elsei=(i - n)*2-1;if (i == 1)break;}printf("%d\n", ++count);return 0;
}

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

北理工乐学H:洗牌(选作)相关推荐

  1. 北理工乐学C语言 47. 【大学】北理工的恶龙

    背景:最近,北理工出现了一只恶龙,它长着很多 头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙.要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的 ...

  2. 北理工乐学 42. 五年级小学生的题目

    42. 五年级小学生的题目 成绩 5 开启时间 2022年10月24日 星期一 08:00 折扣 0.8 折扣时间 2022年11月13日 星期日 23:55 允许迟交 否 关闭时间 2022年11月 ...

  3. 北理工乐学C语言 60.合并排序

    60.合并排序 成绩 0 开启时间 2022年11月7日 星期一 08:00 折扣 0.8 折扣时间 2022年11月27日 星期日 23:35 允许迟交 否 关闭时间 2022年12月4日 星期日 ...

  4. 北理工乐学C语言 49.扫雷

    49. 扫雷 背景 你玩儿过扫雷游戏吧?有个操作系统中带了这个小游戏,那个系统叫什么来着?;-)在游戏中要想过关,就必须要在一个 NxM 的区域上找出所有的地雷.游戏过程中,计算机会在地图上显示一些数 ...

  5. 北理工乐学68.恭喜发财 利是窦来

    68. 恭喜发财 利是窦来 成绩 5 开启时间 2022年11月21日 星期一 08:00 折扣 0.8 折扣时间 2022年12月18日 星期日 23:55 允许迟交 否 关闭时间 2022年12月 ...

  6. 北理乐学c语言基础答案晕,北理乐学C语言答案.doc

    北理乐学C语言答案.doc 7.入门 计算圆柱的侧面积及体积 include void main double a,b; scanf"lfnlf", printf"s.2 ...

  7. 北理工在线作业计算机的主要特点是( ),北理工18秋《计算机组成原理》在线作业【答案】...

    北理工<计算机组成原理>在线作业-0002 试卷总分:100    得分:0 一. 单选题 (共 30 道试题,共 60 分) 1.动态RAM是指() A.工作中存储内容动态变化 B.工作 ...

  8. 关于洗牌的研究(六)——从数学到魔术之完美洗牌

    爱学习,勤思考:学数学,玩魔术.欢迎点击头部蓝字关注MatheMagician,这里有你要的奇迹! 写再前面:本系列作品由MathMagician独家首发,一共有七篇,从数学和魔术两个角度对日常生活中 ...

  9. 洗牌、发牌算法 (打乱扑克牌顺序)

      #include <stdio.h> #include <stdlib.h> #include <time.h> int  d[6]; int  i,n,a,b ...

最新文章

  1. 机器视觉应用软件开发步骤及流程
  2. 一.jquery.datatables.js表格显示
  3. oracle中的一些基本概念
  4. ROS系统 参数的获取和设置
  5. AcWing - 113 特殊排序(归并排序/二分)
  6. python中print是什么意思_python中print什么意思
  7. Python文件操作-文件的增删改查
  8. Axis2搭建WebService服务
  9. 信息学奥赛一本通(1186:出现次数超过一半的数)
  10. 化工计算机软件基础考试题,2013年化工工程师基础知识网友版真题(下午卷)...
  11. lua mysql 事务_为什么在 Redis 实现 Lua 脚本事务?-阿里云开发者社区
  12. C# delegate ,Action,Func
  13. HTML5-打字游戏
  14. 各种电子元器件介绍与电路基础作用
  15. 灰狼/狼群算法优化支持向量机SVM分类预测matlab代码,支持多分类。 Excel数据格式 ,直接运行 。
  16. Vue项目中使用xlsx实现批量导入导出功能
  17. python出现无法定位序数于动态链接库ssleay32.dll的问题
  18. iOS小技能: 自定义相机(基础知识储备)
  19. JavaScript Window窗口对象
  20. 小公司需要企业邮箱么?小企业用什么企业邮箱?

热门文章

  1. 解决jquery版本过低引发的XSS跨站安全漏洞
  2. 淘宝关键词搜索商品API
  3. 教大家电脑重装系统后如何设置硬盘密码
  4. zip gzip 7z 简单比较
  5. ORBSLAM-Atlas
  6. 外资企业申请互联网信息服务经营许可证ICP注意事项有哪些?
  7. 文件上传漏洞 随便贴一个实战演示 BUU Upload(文件上传,过滤后缀,另类一句话) write up
  8. 生意参谋 市场大盘(2021-05)
  9. python中max函数用法_python3 内置函数——max()函数
  10. 使用Java语言搭建一个简易的局域网直播(live)系统