zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    mysql explain语句各项含义
    group_concat用法以及字符串太长显示不全
    合并两个word文档,保持样式不变
    读取word模板,填充数据后导出
    java获取配置文件信息
    mysql5.6免安装使用
    时间格式转换
    Mysql中(@i:=@i+1)的作用
    SVN服务器搭建和使用(一)
    按需讲解之Supervisor
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3560871.html
Copyright © 2011-2022 走看看