CF1204A:
首先看到这题,我的思路是把二进制转化为十进制,再把十进制转化为四进制,可是发现数据量太大,转换的话需要高精,我又懒得写,于是就想道了别的思路。。。


因为两个二进制位相当于一个四进制位,所以我们只需要把序列长度除以二,并向上取整即可,但这题有两个很坑的点:

1,如果刚好为(1,4,8,16,64)这些数的话呢,这个代码就会崩,原因是只有大于这个序列中的数才能被算作一个,否则不行,那样例一举例,100000000(2)是256,但是由于必须大于才可以,所以这个不算一个,但是程序会直接将(9/2)向上取整导致答案是五,所以应特判一下(从第二个字符一个一个判断,如果是一,那肯定不行就跳出去,是零就继续判断下去,如果全都为零那么就把答案减一)但是这有一个问题就是如果二进制串为10怎么办?很简单只要判一下它的长度模二是否等于一即可(其实更确切说是零的个数是否为偶数)

2,可能有二进制串为0的情况,那么需要再特判一下(我在打比赛的时候就是因为这个而被罚分了)。


AC CODE:

#include <bits/stdc++.h>//万能头
using namespace std;//常规
int main()//主函数
{
    string a;//定义一个字符串用来存储二进制串
    cin>>a;//输入
    int sum=0,flag=0,la=a.length();//flag是标记,sum是用来记录
    if(la==1)//特判:如果长度为一则都为零
    {
        cout<<0;//输出零
        return 0;//直接结束
    }
    if(a[0]=='1'&&la%2==1)//特判如果刚好为序列中的数
    {
        for(int i=1;i<la;i++)//一位一位检查
        {
            if(a[i]!='0')//如果不是零
            flag=1;//标记一下
        }
        if(flag==0)//如果除第一位以外其他都为零
        sum=-1;//标记一下
    }
    cout<<ceil(la*1.0/2)+sum;//输出length除二+标记
    return 0;//结束
 } 

CF918A
这道题数据量较小,所以可以用桶去做(用桶去记录每一个数是否是斐波那契数列上的数),具体思路:

1,把斐波那契数列求出来.

2,用桶去记录每一个数是否是斐波那契数列上的数.

3,如果是输出'O',不是输出'o'.

代码如下:


#include <iostream>
using namespace std;//always
int main()//主函数
{
    int f[35],n,b[1005]={0};//开数组,F表示斐波那契上每个数的值,B是用来存储的桶
    cin>>n;
    f[0]=1;//赋初值
    f[1]=b[1]=1;//题面里已说
    for(int i=2;i<=15;i++)
    {
        f[i]=f[i-1]+f[i-2];//把斐波那契数列求出来
        b[f[i]]++;//统计一下
    }
    for(int i=1;i<=n;i++)
    {
        if(b[i]>=1)//如果是斐波那契数列上的输出'O'
        cout<<"O";
        else//不是输出'o'
        cout<<"o";
    }
    cout<<endl;//换行
    return 0;//华华丽丽的结束    
} 

剩下就没有什么可说的了...


最后祝大家在CF的比赛中取得好成绩!