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的比赛中取得好成绩!