2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)

2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)

第 2 题
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
 
const int P = 998244353, N = 1e4 + 10, M = 20;
int n, m;
string s;
int dp[1 << M];
 
int solve() {
    dp[0] = 1;
    for (int i = 0; i < n; ++i) {
        for (int j = (1 << (m - 1)) - 1; j >= 0; --j) {
            int k = (j << 1) | (s[i] - '0');
            if (j != 0 || s[i] == '1')
                dp[k] = (dp[k] + dp[j]) % P;
        }
    }
    int ans = 0;
    for (int i = 0; i < (1 << m); ++i) {
        ans = (ans + 1ll * i * dp[i]) % P;
    }
    return ans;
}
 
int solve2() {
    int ans = 0;
    for (int i = 0; i < (1 << n); ++i) {
        int cnt = 0;
        int num = 0;
        for (int j = 0; j < n; ++j) {
            if (i & (1 << j)) {
                num = num * 2 + (s[j] - '0');
                cnt++;
            }
        }
        if (cnt <= m) (ans += num) %= P;
    }
    return ans;
}
 
int main() {
    cin >> n >> m;
    cin >> s;
    if (n <= 20) {
        cout << solve2() << endl;
    }
    cout << solve() << endl;
    return 0;
}
 

假设输入的 s是包含 n个字符的 01 串,完成下面的判断题和单选题。

判断题
  1. 假设数组 dp 长度无限制,函数 solve() 所实现的算法的时间复杂度是 O(n× 2 m 2^m 2m)。( )

    A. 正确 B. 错误

  2. 输入 11 2 10000000001 时,程序输出两个数 32 和 23。( )

    A. 正确 B. 错误

  3. (2 分)在 n≤10 时,solve() 的返回值始终小于 4 10 ^{10} 10。( )

    A. 正确 B. 错误

选择题
  1. 当 n=10 且 m=10 时,有多少种输入使得两行的结果完全一致?( )

    A. 1024 B. 11 C. 10 D. 0

  2. 当 n≤6时,solve() 的最大可能返回值为( )?

    A. 65 B. 211 C. 665 D. 2059

  3. 若 n=8,m=8,solve 和 solve2 的返回值的最大可能的差值为( )?

    A. 1477 B. 1995 C. 2059 D. 2187

判断题答案与解析
  1. 正确
    solve() 中外层循环遍历 n 次,内层循环遍历 2^(m-1) 次,总时间复杂度为 O(n × 2^m)。
  2. 正确
    对于输入 11 2 10000000001,计算得 solve2() 返回 32,solve() 返回 23,程序依次输出这两个数。
  3. 正确
    当 n ≤ 10 时,solve() 返回值最大不超过 (2^n - 1) × (2^n - 1) = 1023 × 1023 = 1046529,小于 4^10 = 1048576。
选择题答案与解析
  1. B. 11
    两函数结果一致当且仅当字符串 s 单调不增(所有 '1' 在前,'0' 在后)。对于 n = 10,这样的字符串有 11 种('1' 的个数可以是 0 到 10)。
  2. C. 665
    当 n ≤ 6 时,solve() 的最大返回值在 s 全为 '1' 且 m = n 时取得。n = 6 时,最大值为 3^6 - 2^6 = 729 - 64 = 665。
  3. C. 2059
    差值 D = solve2() - solve() 的最大值在 s 为 '0' 后跟 7 个 '1' 时取得,此时 D = (3^7 - 2^7) × (2^1 - 1) = 2059。

专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html


各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
dialect_6 小时前
KMP算法
开发语言·c++·算法
漂流瓶jz7 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
ShineWinsu8 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
傲世仙尊8 小时前
多态-虚表才活到运行期符号表早已消失
c++
chenbingjie_c8 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
是main不是漫8 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
·present·8 小时前
CSAPP(Bomb lab)
c语言·c++
王老师青少年编程9 小时前
2026年信奥赛c++普及组csp-j第二轮复赛真题
c++·真题·csp·信奥赛
时间的拾荒人10 小时前
CMake 常用命令详解:从版本声明到安装部署
c++·面试
D e re k ZH12 小时前
P5025 [SNOI2017] 炸弹
c++·算法