首页 > 代码库 > 洛谷P1145 约瑟夫 数学
洛谷P1145 约瑟夫 数学
洛谷P1145 约瑟夫 数学
在做这题之前最好先做一下普通的约瑟夫问题
普通的约瑟夫问题 有一种递推的做法,比如说 12345 五个数,删掉3 之后,那你就把4编号改成3 5改成4,然后继续做就行了,但是后来这样求出的编号并不是其真实的编号,而是虚的编号
然后这道题如果前k个一直没被删,那么被删除的编号一定是大于 k 的,
这样做下去一直判断下去就行了,因为要mod 然后重新编号有些麻烦,所以还是坐标还是从0开始方便安全
1 #include<cstdio> 2 using namespace std; 3 int i,find,k,m,begin; 4 int check(int remain) 5 { 6 int result=(begin+m-1)%remain; 7 if(result>=k){//判断出列的那个人 8 begin=result; 9 return 1; 10 } 11 else{return 0;} 12 } 13 int main(){ 14 scanf("%ld",&k); 15 m=k; 16 while(!find) 17 { 18 find=1;begin=0;//设置第一个 19 for(i=0;i<k;i++) 20 { 21 if(!check(2*k-i))//如果判断好,就可以退出了…… 22 { 23 find=0;break; 24 } 25 } 26 m++; 27 } 28 printf("%d",m-1);//多加了一个,减回去 29 return 0; 30 }
洛谷P1145 约瑟夫 数学
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。