• 洛谷 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;
            }
        }    
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    各类 HTTP 返回状态代码详解
    ANDROID内存优化——大汇总(转)
    Process Stats:了解你的APP如何使用内存(转)
    Android开发之AlarmManager详解
    转 16 jmeter中的监听器以及测试结果分析
    转 15 jmeter分布式性能测试
    转 14 jmeter性能测试实战--数据库MySQL
    转 12 jmeter性能测试实战--web程序
    转 11 jmeter之图形监控扩展
    转 10 jmeter之动态关联
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7989091.html
Copyright © 2020-2023  润新知