解题思路:分析要好久,懒得分析了,贴了某大牛的的分析,代码就是我自己写的。

     

N个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一被删除的数。

如果这题用链表或者数组模拟整个过程的话,时间复杂度都将高达O(nk),而n<=10000,k<=10000 目测会直接TLE。

那么有没有其他的方法呢?答案是有的。

我们先忽略掉m, 分析一下每k个数删除一次,那就是经典的约瑟夫问题了。

那么,将每个数(1~n)按顺序编号为0~n-1

设第一个删除的数的编号为x,则x= k %n-1 (注意是编号,真正删除的数为编号+1)

那么剩下的n-1个数可以组成一个新的约瑟夫环。

现在的编号是什么呢?显然:(令x+1=y ,就是说y= k%n)

y ,  y+1 , y+2  ...  n-1  , 0 , 1  ... y-2

把y放在第一个的目的是下一次从它开始数数。

重新开始数k个数.

你说重新?嗯。那么就可以这样重新编号:

y             -> 0

y+1            ->1

y+2            ->2

...

...

y-2          -> n-2

现在就变成了n-1个数(编号从0~n-2)的约瑟夫问题了!

假设z是最后n-1个数留下的编号,那么z’是n个人留下的编号,则显然z’=(z+y)% n

如何知道n-1个的解?往下递归就好了嘛,知道n-2即可

所以,有:

ans [1]=0;

ans [n] =(ans[n-1]+k) %n;

(可能有人要问了:上面不是z’=(z+y)% n吗?现在怎么变成 k了?因为y= k%n,模运算)

然后,答案要+1 (编号->数)

那么这一题第一次是m怎么办呢?

也很简单,我们每次都移动K ,有n个数,那么答案就是ans[n]

但是第一次移动的是m,所以后面的移动都有个恒定的差距(k-m)

所以答案为:(ans[n] – (k – m) )% n (注意可能小于0 ,还有最终答案+1)

 1 #include<cstdio>
 2 int main()
 3 {
 4     int n, k, m, A[10005];
 5     while(~scanf("%d%d%d", &n, &k, &m) && (n || m || k))
 6     {
 7         A[1] = 0;
 8         for(int i = 2; i <= n; i++) A[i] = (A[i-1]+k)%i;
 9         int a = (m - k + 1 + A[n]) % n;
10         if(a <= 0) a += n; //注意可能小于0
11         printf("%d\n", a);
12     }
13     return 0;
14 }

View Code

 

转载于:https://www.cnblogs.com/loveprincess/p/4834736.html

LA 3882 And Then There Was One相关推荐

  1. UVa LA 3882 - And Then There Was One 递推,动态规划 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  2. UVa在线比赛单题汇总-----DP专题

    动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...

  3. WCDMA中的URA和LA/RA

    1.关于URA的概念: URA(UTRAN Registration Area)是UTRAN内部区域的划分适用于UE处于RRC连接状态的情形,而且只能在UTRAN端使用(比如由UTRAN发起的寻呼). ...

  4. LA 5717枚举+最小生成树回路性质

    1 /*LA 5717 2 <训练指南>P343 3 最小生成树的回路性质 4 在生成的最小生成树上,新增一条边e(u,v) 5 若原图上u到v的路径的最大边大于e,则删除此边,加上e,否 ...

  5. 编译php时错误make ***[libphp5.la] Error 1

    错误信息 make ***[libphp5.la] Error 1 /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit statu ...

  6. 获取长度length_lab、labE、la、laE、ll、llE 钢筋锚固搭接长度6项参数的相互关系...

    文|施工小诸葛 目录 01   相关概念 02   字母含义 03   lab 非抗震纵向受拉钢筋的基本锚固长度 04   la 非抗震纵向受拉钢筋的锚固长度 05   ll 非抗震纵向受拉钢筋搭接长 ...

  7. qu.la网站上的小说爬取

    qu.la网站上的小说爬取 ##这个项目是我最早开始写的爬虫项目,代码比较简陋 在写这个项目时,我还不会Python的协程编程,用协程可提升爬虫速度至少5倍,参考我的文章[线程,协程对比和Python ...

  8. Linux中的动态库和静态库(.a/.la/.so/.o)

    为什么80%的码农都做不了架构师?>>>    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序 ...

  9. Android 解决 No static method in class La/a/a/a; or its super classes

    错误堆栈: Process: com.chaozh.iReader, PID: 24217java.lang.NoSuchMethodError: No static method getDrawab ...

最新文章

  1. 对DIP IoC DI的理解与运用
  2. c++ 11 锁_国民技术面向智能锁市场提供全系芯片与开源安全解决方案
  3. [译] MDC-101 Flutter:Material Components(MDC)基础(Flutter)
  4. boost::container实现emplace进位的程序
  5. 盘点十个超级实用的 JS 特性
  6. c语言基础练习题 字符串输入scanf/gets 字符串赋值、比大小
  7. Python中__init__和__new__的区别详解
  8. 开源 免费 java CMS - FreeCMS-数据对象-answer
  9. 通过pip下载python包缓慢的解决方法
  10. 简书UI易用性缺陷:投稿按钮太小
  11. SNS类游戏cache server设计浅析
  12. linux环境安装jdk啊
  13. How to install VNC on Ubuntu
  14. 射频微电子学_专注于射频前端芯片,苏州汉天下完成新一轮融资
  15. 干货分享|Research Essay写作的规范及步骤详解
  16. 【Tools】Photoshop CS6安装详解教程
  17. 第一章 【数据分析师---数据可视化1】 matplotlib 静态图,无互动
  18. iOS 微信分享,返回自己的app 闪退
  19. 硬件设计之一——电源设计01:电源防护
  20. kettle-数据迁移场景

热门文章

  1. Python:简单的摄像头程序实现
  2. Agent监控软件在IT工作中的应用
  3. 2009年IT就业“危”中寻“机”
  4. Mac os 10.15配置Java14和Eclipse环境
  5. mysql入门到跑路_MySQL 24小时入门笔记(3),插入和删除,删库到跑路
  6. centos php7 无法加载mysqli_Linux下安装PHP7+MySQL
  7. SAP License:新总帐—Coding Block
  8. SAP License:销售流程
  9. 大鱼风控笔记 3:量化风控政策的关注点
  10. 一个自动上传ip到ftp服务器的bat脚本