zoukankan      html  css  js  c++  java
  • 洛谷 P1885 Moo

    题目描述

    奶牛Bessie最近在学习字符串操作,它用如下的规则逐一的构造出新的字符串:

    S(0) = “moo”

    S(1) = S(0) + “m”+ “ooo” + S(0) = “moo” + “m” + “ooo” + “moo” = “moomooomoo”

    S(2) = S(1) + “m” + “oooo” + S(1) = “moomooomoo” + “m” + “oooo” + “moomooomoo” = “moomooomoomoooomoomooomoo”

    ………

    Bessie就这样产生字符串,直到最后产生的那个字符串长度不小于读入的整数N才停止。

    通过上面观察,可以发现第k个字符串是由:第k-1个字符串 + “m” + (k+2个o) + 第k-1个字符串连接起来的。

    现在的问题是:给出一个整数N (1 <= N <= 10^9),问第N个字符是字母‘m’还是‘o’?

    输入输出格式

    输入格式:

     

    一个整数N。

     

    输出格式:

     

    一个字符,m或者o

     

    输入输出样例

    输入样例#1: 复制
    11
    输出样例#1: 复制
    m

    说明

    样例解释:

    由题目所知:字符串S(0)是moo, 现在要求第11个字符,显然字符串S(0)不够长;

    同样S(1)的长度是10,也不够长;S(2)的长度是25,够长了,S(2)的第11个字符是m,所以答案就输出m。

    思路:分治。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    int l,r,mid;
    int f[50];
    void dfs(int k){
        if(k==0){
            if(n==1)    cout<<"m";
            else cout<<"o";
            return ;
        }
        else if(n>f[k-1]&&n<=f[k-1]+k+3){
            if(n==f[k-1]+1)    cout<<"m";
            else cout<<"o";
            return ;
        }
        else if(n<=f[k-1])    dfs(k-1);
        else if(n>f[k-1]+k+3){
            n-=f[k-1]+k+3;
            dfs(k-1);
        }
    }
    int main(){
        scanf("%d",&n);
        f[0]=3;
        for(int i=1;i<=27;i++){
            f[i]=f[i-1]+f[i-1]+3+i;
            if(f[i]>n){
                dfs(i);
                break;
            }
        }    
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    JVM调优--常用JVM监控工具使用
    jvm启动常用参数配置
    公钥和私钥原理
    tcp三次握手四次挥手
    内存泄漏和内存溢出
    hashmap解析
    Visual C++ 6.0 断点调试记录
    C++中输入一组不确定长度的数
    异或
    NULL与nullptr
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7989091.html
Copyright © 2011-2022 走看看