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;
}
相关推荐
十五年专注C++开发5 分钟前
Oat++: 一个轻量级、高性能、零依赖的 C++ Web 框架
开发语言·c++·web服务·oatpp
John_ToDebug1 小时前
惰性绑定 vs 立即注入:Chromium 扩展 API 初始化策略深度对比
c++·chrome·v8
快乐的划水a1 小时前
c++计时器类
c++
山上三树1 小时前
预处理、编译、汇编、链接详解
c++
2301_789015621 小时前
C++:异常
开发语言·c++·异常·异常的处理方式
CVer儿2 小时前
c++接口内部内存分配问题设计
开发语言·c++
2301_789015622 小时前
C++:智能指针
c语言·开发语言·汇编·c++·智能指针
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 74. 搜索二维矩阵 | C++ 二分查找 (一维展开法)
c++·leetcode·矩阵
a里啊里啊2 小时前
常见面试题目集合
linux·数据库·c++·面试·职场和发展·操作系统
不想写代码的星星2 小时前
C++ 类型擦除:你对象是 Circle 还是 int 不重要,能 draw() 就行,我不挑
c++