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,solvesolve2 的返回值的最大可能的差值为( )?

    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' 的个数可以是 010)。
  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;
}
相关推荐
今儿敲了吗12 分钟前
46| FBI树
数据结构·c++·笔记·学习·算法
oem11030 分钟前
C++中的访问者模式变体
开发语言·c++·算法
暮冬-  Gentle°1 小时前
C++中的工厂方法模式
开发语言·c++·算法
dfafadfadfafa2 小时前
嵌入式C++安全编码
开发语言·c++·算法
计算机安禾2 小时前
【C语言程序设计】第34篇:文件的概念与文件指针
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
会编程的土豆2 小时前
【数据结构与算法】 二叉树做题
开发语言·数据结构·c++·算法
wangjialelele2 小时前
C++11、C++14、C++17、C++20新特性解析(一)
linux·c语言·开发语言·c++·c++20·visual studio
闻缺陷则喜何志丹3 小时前
【博弈论】P8144 [JRKSJ R4] BBWWBB|普及+
c++·算法·洛谷·博弈论
tankeven3 小时前
HJ135 计树
c++·算法
㓗冽3 小时前
时间转换-进阶题12
c++·算法