zoukankan      html  css  js  c++  java
  • POJ 2359 Questions(约瑟夫环——数学解法)

    题目链接:

    http://poj.org/problem?id=2359

    题意描述:

    输入一个字符串

    按照下面的规则,如果剩下的最后一个字符是‘?’,输出“Yes”,如果剩下的最后一个字符是' '(空格),输出“No”,其他字符均输出“No comments”

    规则:

    将该字符串首尾相接,从第一个字符数,数到1999(如果数到结尾则从头开始数,构成约瑟夫环)时,将该字符删除,从删除字符的下一个开始从头数,

    知道删除剩余最后一个字符。

    解题思路:

    刚开始读完题的时候,并没有想到是约瑟夫问题(事后恍然大悟)。约瑟夫问题,有两种解法,分别是模拟解法和数学解法。

      模拟的话,直接模拟报数过程,使用数组,链表均可。

      不过这里介绍一下更高效的数学解法,先上代码:

       int p=0;
        for(i=2;i<=l;i++)
            p=(p+1999)%i;

      由于我们只需要知道最后一个字符的位置,没必要模拟过程,所以我们通过一定的数学计算计算出要求的结果即可。

      具体讲解请参考博客:http://blog.csdn.net/allenhappy/article/details/26713241(原谅我的偷懒,他讲的相对还是很清楚的)

    AC代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<ctype.h>
     5 #include<algorithm>
     6 using namespace std;
     7 const int inf=99999999;
     8 
     9 char a[30000],b[30100];
    10 int main()
    11 {
    12     int i,l;
    13     b[0]='';
    14     while(gets(a) != NULL)
    15         strcat(b,a);
    16     l=strlen(b);
    17     int p=0;
    18     for(i=2;i<=l;i++)
    19         p=(p+1999)%i;
    20         
    21     if(b[p]=='?')
    22     printf("Yes
    ");
    23     else if(b[p]==' ')
    24     printf("No
    ");
    25     else    
    26     printf("No comments
    ");    
    27     return 0;
    28 }
  • 相关阅读:
    畅通工程续 dijkstra
    能量项链 区间dp
    机器人军团
    skiing
    数论知识
    灯泡游戏
    60. 第k个排列
    17. 电话号码的字母组合
    101. 对称二叉树
    144. 二叉树的前序遍历
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/7647628.html
Copyright © 2011-2022 走看看