ZOJ - 1633 Big String(神奇的模拟构造)

颜文字题目吼吼……题目在这里

题目大意:

是说有一段无限延伸的字符串,(这段字符串是由颜文字构成的哈哈),字符串的延伸规律如下:

假设A=“T.T”,B=“^__^”,那么C="T.T^__^",然后A=B,B=C;这个无限延伸的字符串说的是C。给你一个数n,要求输出在这个无限延伸的字符串里的第n位的字符是什么。

题目思路:

  首先看题目给的数据,2^63-1,已经到达long long的边界了,显然开这么大的数组是不现实的,但是有没有发现无论字符串延伸多么长,一共就只有7个字符,而且类似循环的在延伸(其实是在递推这延伸)

  因为第三个串由前两个串拼接,这和斐波那契数列的定义一致,所以我们可以先求出串长的斐波那契数列,存放在数组中,然后求解每组数据;由于当前串是前两个串拼接而来,对于给定的n,可以找到大于n的最小的串长,那么n一定在前两个串中,假设紧邻的三个串分别是A,B,C,当前n在C中,由于n大于B,所以n一定在A中,由题意,A在B后,所以n-len(B)即在A中的位置,如此循环直到n小于7.

      不过这道题错了好多次,一直返回段错误,后来发现我把数组开得太大了……开到了10^8(记住记住

题目代码:

#include<iostream>
#include<cstdio>
#include<string>
#define maxn 2000000

using namespace std;

long long f[maxn];

int main(void)
{
     string str="T.T^__^";
     long long n;
     //scanf("%lld",&n);
     f[1]=4;
     f[2]=3;
     for(int i=3;i<maxn;i++)
     {
          f[i]=f[i-1]+f[i-2];
     }
     while(~scanf("%lld",&n))
     {
          while(n>7)
          {
               long long i=1;
               while(n>f[i])//寻找超过询问位置的字符串
               {
                    i++;
               }
               n-=f[i-1];
          }
          printf("%c\n",str[n-1]);
          //cout<<str[n-1]<<endl;
     }

     return 0;
}

呼呼

猜你喜欢

转载自blog.csdn.net/destiny1507/article/details/81229648
ZOJ