LA 3882 And Then There Was One
解题思路:分析要好久,懒得分析了,贴了某大牛的的分析,代码就是我自己写的。
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)
#include<cstdio>
int main()
{
int n, k, m, A[];
while(~scanf("%d%d%d", &n, &k, &m) && (n || m || k))
{
A[] = ;
for(int i = ; i <= n; i++) A[i] = (A[i-]+k)%i;
int a = (m - k + + A[n]) % n;
if(a <= ) a += n; //注意可能小于0
printf("%d\n", a);
}
return ;
}
LA 3882 And Then There Was One的更多相关文章
- LA 3882 - And Then There Was One(约瑟夫 递归)
看题传送门 题目大意: N个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一被删除的数. 如果这题用链表或者数组模拟整个过程的话,时间复杂度都将高达O(nk),而n<=10000,k&l ...
- LA 3882 And Then There Was One[约瑟夫问题的变形]
And Then There Was One UVALive - 3882 Sample Input Sample Output //设f[i]为(原约瑟夫问题)第i次要删除的标号 #includ ...
- LA 3882
动态规划: 白书上的题,看了好久看不懂刘汝佳的解法: 在网上无意中看到了大神的思路,比较好理解,膜拜! 他的思路是这样的: 设d[i]是n个数按顺时针方向分别从0开始编号,第一次删除0,以后每k个数删 ...
- UVa LA 3882 - And Then There Was One 递推,动态规划 难度: 2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- LA 3882 经典约瑟夫环问题的数学递推解法
就是经典约瑟夫环问题的裸题 我一开始一直没理解这个递推是怎么来的,后来终于理解了 假设问题是从n个人编号分别为0...n-1,取第k个, 则第k个人编号为k-1的淘汰,剩下的编号为 0,1,2,3. ...
- leggere la nostra recensione del primo e del secondo
La terra di mezzo in trail running sembra essere distorto leggermente massima di recente, e gli aggi ...
- Le lié à la légèreté semblait être et donc plus simple
Il est toutefois vraiment à partir www.runmasterfr.com/free-40-flyknit-2015-hommes-c-1_58_59.html de ...
- Mac Pro 使用 ll、la、l等ls的别名命令
在 Linux 下习惯使用 ll.la.l 等ls别名的童鞋到 mac os 可就郁闷了~~ 其实只要在用户目录下建立一个脚本“.bash_profile”, vim .bash_profile 并输 ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
随机推荐
- 一步完成 MySQL 向 Redis 迁移
从mysql搬一个大表到redis中,你会发现在提取.转换或是载入一行数据时,速度慢的让你难以忍受.这里我就要告诉一个让你解脱的小技巧.使用“管道输出”的方式把mysql命令行产生的内容直接传递给re ...
- JAVA类型信息——Class对象
JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...
- springMVC视频教程
http://edu.51cto.com/index.php?do=lession&id=42165
- 李洪强经典iOS面试题11
#import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别? #import是Objective-C导入头文件的关键字, ...
- lintcode:两数组的交 II
题目 计算两个数组的交 注意事项 每个元素出现次数得和在数组里一样答案可以以任意顺序给出 样例 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2]. 解题 ...
- lintcode:线段树的修改
线段树的修改 对于一棵 最大线段树, 每个节点包含一个额外的 max 属性,用于存储该节点所代表区间的最大值. 设计一个 modify 的方法,接受三个参数 root. index 和 value.该 ...
- tomcat console
1.大家都知道,在Tomcat5及其以后的版本中,当启动tomcat之后,是看不到控制台中的manager应用的.Manager的应用还是很有好处的,可以直接在控制台上(类似于weblogic上的co ...
- 271. Encode and Decode Strings
题目: Design an algorithm to encode a list of strings to a string. The encoded string is then sent ove ...
- word2010中怎样快速修改同级标题格式
我要把所有三级目录的字体增大,怎样能一次选中批量修改?文章很长,一百多个三级标题.word 2010中提供了快速修改的方法: ①将光标定位在一个三级标题中② <IGNORE_JS_OP> ...
- JavaScript DOM实战:创建和克隆元素
DOM来创建和克隆元素. createElement()和createTextNode() createElement()和createTextNode()做的事情正如它们的名字所说的那样.最常见的J ...