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;
            }
        }    
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    理解构造器
    if与switch的性能比较
    Java对象的内存(一)
    shell编程_条件判断if
    shell编程_基础&变量
    集群架构篇:Nginx架构演进<拆分数据库 多台web节点共享静态资源>
    集群架构篇:Nginx流行架构LNMP
    集群架构篇:Nginx常用模块
    LInux系统@安装CentOS7虚拟机
    docker pull越来越慢的解决方法
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7989091.html
Copyright © 2011-2022 走看看