A. BowWow and the Timetable
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
In the city of Saint Petersburg, a day lasts for 21002100 minutes. From the main station of Saint Petersburg, a train departs after 11 minute, 44 minutes, 1616 minutes, and so on; in other words, the train departs at time 4k4k for each integer k≥0k≥0. Team BowWow has arrived at the station at the time ss and it is trying to count how many trains have they missed; in other words, the number of trains that have departed strictly before time ss. For example if s=20s=20, then they missed trains which have departed at 11, 44 and 1616. As you are the only one who knows the time, help them!
Note that the number ss will be given you in a binary representation without leading zeroes.
Input
The first line contains a single binary number ss (0≤s<21000≤s<2100) without leading zeroes.
Output
Output a single number — the number of trains which have departed strictly before the time ss.
在圣彼得堡,一天持续2100分钟。从圣彼得堡主站出发,一列火车经过1分钟、4分钟、16分钟等后出发;换句话说,对于k≥0的每个整数,列车在4k时刻出发。“汪汪”团队当时已经到达车站,正在计算他们错过了几趟火车;换句话说,严格在时间s之前发车的列车数量。例如,如果s=20,那么他们错过了发车时间为1、4和16的列车。因为你是唯一知道时间的人,帮助他们吧!
注意,数字s将以二进制形式给出,没有前导零。
输入
第一行包含一个没有前导零的二进制数字s(0≤s<2100)。
输出
输出一个数字——严格在时间s之前离开的火车的数量。
这道题能想到二进制转十进制然后判断满足的个数,
但是转十进制范围已经超过了long long,直接模拟会溢出
因为满足条件数值的都是4的次幂,所以二进制首位1后跟的2k个0即为4的k次幂
直接对0的个数分析即可
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std;
char s[1000006];
int main()
{
cin >> s;
int flag = 0;
long long len = strlen(s);
if((s[0]=='0'||s[0]=='1')&&len==1)
{
printf("0\n");
return 0;
}
for (int i = 1; i < len; i++)
{
if(s[i]=='1')
{
flag = 1;
break;
}
}
if (flag)
len--;
else
len=(len - 2);
printf("%lld\n", len/2+1);
}