CF1204A 题解

发布时间 2023-08-02 08:33:02作者: So_noSlack

洛谷链接&CF 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

给定一个二进制字符串 \(S\),求这个二进制数包含 \(4 ^ k\) 的个数。

特殊的:若 \(4 ^ k = S\) 则此情况不计

思路

简单思维题

通过二进制进行操作,首先二进制长度 \((1 \le len \le 100)\) 还是挺大的,如果想直接模拟的话,转为十进制是不现实的,所以只能通过二进制操作

通过样例观察可发现,二进制无非就两种情况

  1. 长度为偶数

  2. 长度为奇数

对于情况 \(1\) 就很简单,因为此题的根本是找二进制的奇数位的个数,所以对于长度为偶数的字符串,直接输出长度除以 \(2\) 即可。

对于情况 \(2\),我们就需要判断除最高位以外是否有其他位为 \(1\) 的情况,也非常简单,稍微模拟即可。

经过以上分类讨论,思路就很清晰了,下面是代码实现

#include<iostream>
using namespace std;

string str;

int main(){
    cin >> str; 
    int n = str.length(); // 记录字符串长度
    // 长度为偶数,情况 1
    if(!(n & 1)) {
        cout << n / 2;
        return 0; 
    }
    // 长度为奇数,情况 2
    // 模拟即可
    for(int i = 1; i < n; i ++)
        if(str[i] == '1'){
            cout << n / 2 + 1; // 除最高位有其他位为 1,正常输出
            return 0;
        }
    cout << n / 2; // 否则特判
    return 0;
}

提交记录

\[\text{The End!} \]