Codeforces Round #581 (Div. 2)——A:BowWow and the Timetable(巧妙进制转换)

题目描述:

题目传送门:http://codeforces.com/contest/1204/problem/A
在这里插入图片描述在这里插入图片描述
题目大意:有一个地方,它的一天是2^100 分钟,每隔4^k分钟发一趟车(1,4,16,64……)现在输入一个二进制数,问错过了多少趟列车。

思路分析:

首先想到的当然是进制转换,二进制转换为十进制然后再跟4^k进行比较,确定k值。但是这道题由于数据量过大,转换为十进制时,范围已经超过了long long,直接模拟会出现错误(test 4)因此需要用大数据、高精度来解决,比较麻烦
由于两个二进制位表示的是4,即100=4,10000=4*4=16,1000000=64……故我们可以直接将二进制数的位数除以2并向上取整得到错过的车的趟数。因为101,110,111三个数其实错过的列车的趟数是一样的,都是两趟(第1分钟发的,第四分钟发的),差不出新的一趟,所以我们只需要考虑位数,而不需要考虑这个位置上究竟是0还是1。同样的10000,10001,10010,10011,10100,10101,10110,10111……11111这几个数也是只错过了三趟车。而为什么要向上取整,是因为比如1000=8,4<8<16,所以1000(4位)也是错过了两趟,同样的,1001,1010,……,1111都是两趟,和101,110,111是一样的,所以除以二之后向上取整都是2。
但是这样思考还有一个问题,如果数据是100,10000,1000000,……时,应该是正好赶上这一趟车,并没有错过,所以最终所得的结果要减去1。还有另一种特殊情况,就是当二进制数位0或者1的时候其实没有错过任何一趟车,结果是0,测试数据里面有涉及,所以要再加一组判断。

AC代码:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    string s;
    cin>>s;
    int sum=0,flag=0,l=s.length();
    if(l==1)
    {
        cout<<0;
        return 0;
    } 
    if(s[0]=='1'&&l%2==1)
    {
        for(int i=1;i<l;i++)//一位一位检查
        {
            if(s[i]!='0')//如果不是零
            flag=1;//标记一下
        }
        
        if(flag==0)//如果除第一位以外其他都为零
        sum=-1;//结果要减1 
    }
    cout<<ceil(l*1.0/2)+sum;//输出length除二+标记
   // ceil() 是向上取整函数,包含在<cmath> 里面 
    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值