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
",2*(sum - i/2)+1) ;
     }
     return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3560871.html