神奇字符串
题目描述:
神奇字符串的定义为: 只含有1和2, 且将其按照连续的1和2拆开后,对应的每部分数字数量恰好和原字符串相同 例如: 1 22 11 2 1 22 1 22 11 2 11 22 …… 每部分对应的1和2个数为 1 2 2 1 1 2 1 2 2 1 2 2 …… 恰好等于原串 现给定N,求神奇串的前N位中有多少个1 .
输入描述:
第一行输入一个T,代表数据组数 接下来的T行,输入N 1 <= N <= 100000
输出描述:
对每一组输入,在一行中输出前N位中1的个数。
输入样例:
1
6
输出样例:
3
解题思路:
找规律,根据第三个数字2开始往后生成数字,此时生成两个1,然后根据第四个数字1,生成一个2,再根据第五个数字1,生成一个1,以此类推,生成的数字1或2可以通过异或3来交替生成,最后统计前n位神奇字符串中1的个数即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        string str = "122";
        int i = 2;
        while(str.length() < n)   //生成一个长度为n的神奇字符串
        {
            str += string(str[i++]-'0',str.back()^3);  //str.back()就相当于str[str.length()-1]
        }
        int cnt = count(str.begin(),str.begin()+n,'1');
        cout << cnt << endl;
    }
    return 0;
} 
											
										 
				 
                    
								
 
   
   
   
   
   
  
 
                    
					        
											 
											








 
             
             
             
             
             
             
             
             
             
             
             
                     
                    
还没有任何评论,你来说两句吧!