外星猫:(一只猫,原来的基因是“cat”,第二秒变成“catacat”,第三秒变成“catacataacatacat”,以此类推,询问猫的第i个基因是什么,什么时候出现的)
首先,这道题不可能模拟猫的基因(模拟一定会超时),我们可以开一个数组a[i]表示第i秒钟猫的基因长度,而且根据题目可以得到一个递推式:a[i]=a[i-1]*2+i-1。这样就可以直接解决第二个问题。对于第一个问题,我们可以把a[q](假设a[q]时猫的基因长度正好大于要求的i)长度的基因分成三部分——第一部分:第q-1秒时猫的基因;第二部分:第q秒时猫基因内添加的那一段a;第三部分:第q秒复制第q-1秒时的那一段基因——然后判断要求的第i个字符在哪部分里。当第i个字符在第二部分里时这个字符一定是a;当这个字符在第一部分时,继续递归即可;当字符在第三部分时,只要让i减去a[q-1]的长度和q-1即可。
具体代码实现如下:
#include<bits/stdc++.h>
using namespace std;
int a[1000]={0,3},q=1,t,c,a1,hzk;
char b[10]={' ','c','a','t'};
void dfs(int x){//把整个基因分成三部分,第一部分是原来的基因,第二部分是添加的t-1个a,第三部分是复制的基因
if(x<=3){//如果只剩下三个以内的字符
hzk=x;//记录
return;
}
if(x<=a[q-1]){//如果在第一