HDOJ 1443 约瑟夫环的最新应用
来源:互联网 发布:淘宝主播userid 编辑:程序博客网 时间:2024/06/11 00:49
输入:男生女生的个数k(男生女生人数相等都为k,输出:m值
例: 输入:2,输出:7
输入:4,输出:30
本题是约瑟夫环变形 先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0; f(i) 表示当前子序列中要退出的那个人(当前序列编号为0~(n-i));
拿个例子说:K=4,M=30;
f(0)=0;
f(1)=(f(0)+30-1)%8=5; 序列(0,1,2,3,4,5,6,7)中的5
f(2)=(f(1)+30-1)%7=6; 序列(0,1,2,3,4,6,7)中的7
f(3)=(f(2)+30-1)%6=5; 序列(0,1,2,3,4,6)中的6
f(4)=(f(3)+30-1)%5=4; 序列(0,1,2,3,4)中的4
........
依据题意,前K个退出的人必定是后K个人,所以只要前k轮中只要有一次f(i)<k则此m不符合题意。
注意:
本题有几点需要注意,否则很容易超时;第一、运用公式j=(j+m-1)%(n-i),推导出下一个出现的元素在第几号位置,如果j<k的话,不符合题意。
第二点。就是m,当只剩下k+1个数的时候,则上一个消失的数一定是在目前仅剩的bad左边或者是右边,所以m%(k+1)==0或者1
有了这两个条件,可以加快程序的速度。。。
完整的实现代码如下:
#include "stdio.h"#include "stdlib.h"int x[15];/*运用公式j=(j+m-1)%(len-i);推导出下一个出现的元素在第几号位置,如果j<k的话,不符合题意。若有7个人,报到3的人依次出列第一次 j=(j+m-1)%(len-i)=(0+3-1)%(7-0)=2 下标为2的3出列 新序列为 1 2 4 5 6 7第二次 j=(j+m-1)%(len-i)=(2+3-1)%(7-1)=4 下标为4的6出列 新序列为 1 2 4 5 7第三次 j=(j+m-1)%(len-i)=(4+3-1)%(7-2)=1 下标为1的2出列 新序列为 1 4 5 7第四次 j=(j+m-1)%(len-i)=(1+3-1)%(7-3)=3 下标为3的7出列 新序列为 1 4 5第五次 j=(j+m-1)%(len-i)=(3+3-1)%(7-4)=2 下标为2的5出列 新序列为 1 4第六次 j=(j+m-1)%(len-i)=(2+3-1)%(7-5)=0 下标为0的1出列 新序列为 4第七次 j=(j+m-1)%(len-i)=(0+3-1)%(7-6)=0 下标为0的4出列 新序列为空,至此,所有人已经全部出列,出列的顺序为:3 6 2 7 5 1 4*/int test(int k,int m){int i,j=0,len=k*2;for(i=0;i<k;i++){j=(j+m-1)%(len-i); //约瑟夫环公式if(j<k)return 0; //遇到前k轮中有小于k的直接返回0 }return 1;}/*接下来说说m的取值范围:我们考察一下只剩下k+1个人时候情况,即坏人还有一个未被处决,那么在这一轮中结束位置必定在最后一个坏人,那么开始位置在哪呢?这就需要找K+2个人的结束位置,然而K+2个人的结束位置必定是第K+2个人或者第K+1个人,这样就出现两种顺序情况:GGGG.....GGGXB 或 GGGG......GGGBX (X表示有K+2个人的那一轮退出的人)所以有K+1个人的那一轮的开始位置有两种可能即最后一个位置或K+1的那个位置,限定m有两种可能:GGGG......GGGBX 若K+2个人的结束位置在最后一个(第K+2个),则m%(k+1)==0GGGG......GGGXB 若K+2个人的结束位置在倒数第二个(第K+1个),则m%(k+1)==1 */void Joseph(void){int m,k;for(k=1;k<15;k++){m=k+1;while(1){if(test(k,m)) // m%(k+1)==0的情况{x[k]=m;break;}if(test(k,m+1)) // m%(k+1)==1的情况{x[k]=m+1;break;}m+=k+1;}}}int main(void){ int k;Joseph();while(scanf("%d",&k),k)printf("%d\n",x[k]);system("pause");}
- HDOJ 1443 约瑟夫环的最新应用
- hdoj 1443 Joseph【约瑟夫环】
- hdoj Joseph 1443 (约瑟夫环&打表)
- ♥HDOJ 1443-Joseph【约瑟夫环+规律】
- HDU1443(约瑟夫环的应用)
- HDOJ 1443 Joseph(打表+数学—约瑟夫环)
- 约瑟夫环的问题与应用(JAVA)
- 约瑟夫环应用问题
- hdoj 2211 杀人游戏 【约瑟夫环】
- 链表应用--约瑟夫环
- 循环链表的应用_约瑟夫环
- 队列的简单应用-杨辉三角和约瑟夫环
- 数据结构 循环链表的应用:约瑟夫环问题
- 循环链表的应用——约瑟夫环
- 约瑟夫环问题 【循环链表的应用】
- 线性表的应用——约瑟夫环
- 约瑟夫环的算法
- 约瑟夫环的解决
- SQL语言的基本操作
- Android 智能手机
- STS plugins
- Spring事务配置的五种方式
- JBPM数据库表解析与实例
- HDOJ 1443 约瑟夫环的最新应用
- Poj DancingLinks(3372 3074 3076)
- a weird result when I try to print the value of point by %p format
- CRLF -- Carriage-Return Line-Feed 回车换行
- C++设计模式-原型
- poj1080
- ORA-00845: MEMORY_TARGET not supported on this system
- 笔记本配置
- Java学习问题1: boolean型数据占几个字节?