【每日一题】【枚举】【估计时间复杂度】[蓝桥杯 2024 省 B] 好数 C++

P10424 [蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数

题目描述

一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。

给定一个正整数 N N N,请计算从 1 1 1 N N N 一共有多少个好数。

输入格式

一个整数 N N N

输出格式

一个整数代表答案。

样例 #1

样例输入 #1

24

样例输出 #1

7

样例 #2

样例输入 #2

2024

样例输出 #2

150

提示

样例 1 解释

24 24 24 以内的好数有 1 , 3 , 5 , 7 , 9 , 21 , 23 1,3,5,7,9,21,23 1,3,5,7,9,21,23,一共 7 7 7 个。

数据规模与约定

  • 对于 10 % 10\% 10% 的测试数据, 1 ≤ N ≤ 100 1 \leq N \le 100 1N100
  • 对于全部的测试数据, 1 ≤ N ≤ 1 0 7 1 \le N \leq 10^7 1N107

做题思路

做蓝桥杯的题首先要看数据规模和运行时间,第二看时间复杂度。

这道题最暴力的做法就是从1到 n n n枚举,然后每一个数字都判断一下是否为好数即可。

从时间复杂度来看
粗略估计:
从1到n每次最多内循环7次,总共 O ( 7 N ) O(7N) O(7N)
因为 1 ≤ N ≤ 1 0 7 1 \le N \leq 10^7 1N107
所以不会超时。

顺便说说如何判断是否为好数。

一个数按位且1后是判断最后一位(最低位)是为奇数,如果按位且1后答案为1那么最低位就是奇数;否则为偶数。

这里还用到了按位异或判断是否一致,也就说奇数位(个位、百位、万位……)上的数字是不是奇数的判断。

if((x&1) ^ k)return false;

如果不看数据规模和运行时间、时间复杂度,首先想着优化就完蛋了。

时间复杂度分析

粗略估计:
从1到n每次最多内循环7次,总共 O ( 7 n ) O(7n) O(7n)

代码

#include <iostream>
#include <algorithm>
#include <vector>
using namespace  std;
bool check(int x){
    bool k = true;
    while(x){
        if((x&1) ^ k)return false;
        k^=true;
        x/=10;
    }
    return true;
}
int main(){
    int n,cnt = 0;cin >> n;
    for(int i=1;i<=n;i++)
        if(check(i))cnt++;
    cout << cnt;
    return 0;
}
  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯2023年B组C++赛的题目包括了2个填空题和8个编程题。根据参赛者的博客\[1\],本届蓝桥杯的难度相较于上届有所增加,编程题的难度较大,而思维题的数量较少。参赛者在博客中提到了其中一个题目,即试题A:日期统计\[2\]。在博客中还提到了一种解题方法,即暴力枚举\[3\]。暴力枚举的代码如下: ```cpp #include <iostream> #include <cmath> #include <algorithm> using namespace std; const int total = 23333333; const double H = 11625907.5798; int main() { for (int i = 0; i < total / 2; i++) { double ans = 0; ans -= 1.0 * i * i / total * log2(1.0 * i / total); ans -= 1.0 * (total - i) * (total - i) / total * log2(1.0 * (total - i) / total); if (abs(ans - H) < 1e-4) { cout << i << endl; return 0; } } return 0; } ``` 以上是关于蓝桥杯2023年B组C++赛的一些信息。希望对你有所帮助! #### 引用[.reference_title] - *1* *3* [2023年第十四届蓝桥杯C++B组复盘](https://blog.csdn.net/m0_46326495/article/details/130043563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [2023第十四届蓝桥杯C++B组题目回顾与参赛感想](https://blog.csdn.net/BinBinCome/article/details/130048888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值