SDUT 2351 In Danger

点我看题目 

题意 : 有n个兵想要自杀,所以他们决定围成一个圈,从1开始一直环到n,然后每第2个开始自杀,但是有一个兵不想死,所以让你编程求出最后一个应该死的人的位置,这样的话就剩他自己他可以不自杀了,也就是说如果是5个人的话,第2个位置的人自杀,然后再第2个,就是第4个位置的人自杀,然后再第2个,应该是第一个位置的人自杀,然后是5,最后剩了第三个位置的人。

思路 : 好像约瑟夫环问题,不过这个有点小难,就是找规律,一开始不知道,后来YN美女说让我自己画画,然后我就从5画到14,这结果是3 5 7 1 3 5 7 9 11 13 。我就没再画下去,我也没找出规律来,刚巧前几天做CF的时候有一道题可规律可模拟,模拟的代码挺老长,规律的代码核心就4行,让我对规律帝很是敬仰,我去搜结题报告的时候,有一个大神分析的十分到位,不光如此,找规律的时候涉及的一些知识链接他也有贴出来,虽然我点进去都是英文的,但是,我发现了一个功能就是他里边有千千万万个数列,你想要找某个数列规律,只要在输入部分数列中的数他就可以帮你找到,所以我就去搜了。。。。。结论就是a(n) = 2*(n - 2^floor(log2(n))) + 1 

链接在这儿

#include <stdio.h>

#include <string.h>

#include <iostream>



using namespace std ;

int  work(int m,int n)

{

    int sum = 1;

    for(int i = 1 ; i <= n ; i++)

    sum *= 10 ;

    return m*sum ;

}

int main()

{

     char ch[5] ;

     while(scanf("%s",ch) != EOF)

     {

         if(strcmp(ch,"00e0") == 0) break ;

         int s = (ch[0]-'0')*10+ch[1]-'0' ;

         int x = ch[3]-'0' ;



         int sum = work(s,x) ;

         int i = 1,num = 0  ;

         while(i <= sum)

         {

              i *= 2 ;

              num++ ;

         }

         printf("%d\n",2*(sum - i/2)+1) ;

     }

     return 0 ;

}
View Code

 

你可能感兴趣的:(in)