• noi Big String 超级字符串


    //来自2017青岛信息竞赛第一题

    9269:Big String超级字符串

    总时间限制: 
    10000ms
     
    单个测试点时间限制: 
    1000ms
     
    内存限制: 
    131072kB
    描述

    fish在无数次oi竞赛的狱炼之后,悟出一个真理,往往越容易的题目,陷阱越深。由此,fish创作了这道题目。 
    fish首先给出两个短串A=’4567’ (4个字符), B=’123’(3个字符)。反复进行如下的操作得到一个长串C。 
    (1)C=B+A (例如:A=’4567’ ,B=’123’ C=B+A=’1234567’) 
    (2)A=B B=C (上述例子 A=’123’ B=’1234567’) 
    请你编程找出这个长串的第n个字符。 

    输入

    第一行包含一个整数 n (1<=n<=10^9)

    输出

    仅一行,包含一个字符,表示这个长串的第n个字符。

    样例输入
    9
    样例输出
    2



    比赛发挥不好,明明已经找到正解了,却卡了一下,没处理出来
    其实很简单,不要直接处理字符串,转化成数字

    可以发现整个字符串就是“1234567”不断拓展出去的
    每一个新子串都可以看做是1234567或它的子串组成的
    那么我们只需要知道第n位是1234567 中的第几位,而对这个那么长的子串究竟是什么根本没用=。=
    用数字存一共有几位,然后处理
    例如9,
    我们发现一次运算后c长7,第二次长...
    9就在这之间
    说明需要进行两次拓展才有第九位
    然而前七位对我们来说是没用的
    所以直接不管
    因此九位为就相当于剩下的第二位,小于7,所以直接得到(若大于7只需重复上述过程)


    附AC代码
    #include<cstring>
    #include<cstdio>
    #include<iostream>
    using namespace std;
    string s;
    int l,n,pr;
    int main(){
        s="1234567";
        int a=4,b=3;
        scanf("%d",&n);
        while(n>7){
            a=4;b=3;
            l=0;pr=0;
            while(l<n){
                pr=l;
                l=b+a;
                a=b;
                b=l;
            }
            n=n-pr;
        }
        cout<<s[n-1];
    }

    
    
    


  • 相关阅读:
    UVA 11995
    LA 5031
    防卫导弹
    跳马问题
    UVA 11992
    POJ 3264 Balanced Lineup
    0-1背包
    石子合并
    小技巧
    Android广播中有序和无序的区别
  • 原文地址:https://www.cnblogs.com/nengshen/p/6910514.html
Copyright © 2020-2023  润新知