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

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

第 1 题

(序列合并) 有两个长度为 N的单调不降序列 A和 B,序列的每个元素都是小于 10 9 10^9 109的非负整数。在 A和 B中各取一个数相加可以得到 N 2 ^2 2个和,求其中第 K小的和。上述参数满足 N≤ 10 5 10^5 105和 1≤K≤ N 2 N^2 N2。

cpp 复制代码
#include <iostream>
using namespace std;
 
const int maxn = 100005;
 
int n;
long long k;
int a[maxn], b[maxn];
 
int* upper_bound(int *a, int *an, int ai) {
    int l = 0, r = ___①___;
    while (l < r) {
        int mid = (l+r)>>1;
        if (___②___) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return ___③___;
}
 
long long get_rank(int sum) {
    long long rank = 0;
    for (int i = 0; i < n; ++i) {
        rank += upper_bound(b, b+n, sum - a[i]) - b;
    }
    return rank;
}
 
int solve() {
    int l = 0, r = ___④___;
    while (l < r) {
        int mid = ((long long)l+r)>>1;
        if (___⑤___) {
            l = mid + 1;
        } else {
            r = mid;
        }
    }
    return l;
}
 
int main() {
    cin >> n >> k;
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < n; ++i) cin >> b[i];
    cout << solve() << endl;
}
 
  1. ① 处应填( )?
    A. an-a
    B. an-a-1
    C. ai
    D. ai+1
  2. ② 处应填( )?
    A. a[mid] > ai
    B. a[mid] >= ai
    C. a[mid] < ai
    D. a[mid] <= ai
  3. ③ 处应填( )?
    A. a+l
    B. a+l+1
    C. a+l-1
    D. an-l
  4. ④ 处应填( )?
    A. a[n-1]+b[n-1]
    B. a[n]+b[n]
    C. 2 * maxn
    D. maxn
  5. ⑤ 处应填( )?
    A. get_rank(mid) < k
    B. get_rank(mid) <= k
    C. get_rank(mid) > k
    D. get_rank(mid) >= k
题解:

本题要求从两个长度为 (N) 的单调不降序列 (A) 和 (B) 中各取一个数相加,得到 (N 2 ^2 2) 个和,求第 (K) 小的和。解题思路是利用二分答案,统计有多少个和不超过给定的值 (sum),然后通过二分找到最小的 (sum) 使得不超过它的和的数量至少为 (K)。

  • :在 upper_bound 函数中,需要确定二分查找的右边界,即数组的长度。由于参数 aan 分别指向数组起始和结束的下一个位置,因此长度应为 an - a选A
  • upper_bound 函数的目标是找到第一个大于 ai 的元素,因此在二分过程中,当 a[mid] > ai 时,应将右边界移动到 mid,否则左边界移动到 mid + 1选A
  • :二分查找结束后,左边界 l 即为第一个大于 ai 的元素的索引,因此返回指针 a + l选A
  • :二分答案的右边界应设为可能的最大和,即 (a[N-1] + b[N-1])。选A
  • :在二分答案过程中,若 get_rank(mid)(即不超过 mid 的和的数量)小于 (K),说明 mid 太小,需要增大左边界;否则减小右边界。因此条件为 get_rank(mid) < k选A

专栏推荐:信奥赛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;
}
相关推荐
一只小小的芙厨17 小时前
AT_tkppc3_d 巨大チェスボード 题解
c++·题解
我在人间贩卖青春17 小时前
C++之继承与派生类的关系
c++·向上造型·向下造型
Trouvaille ~17 小时前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
EmbedLinX17 小时前
嵌入式之协议解析
linux·网络·c++·笔记·学习
wangjialelele17 小时前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑17 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
李日灐17 小时前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
汉克老师17 小时前
GESP2025年6月认证C++二级( 第一部分选择题(1-8))
c++·循环结构·表达式·分支结构·gesp二级·gesp2级
rainbow688917 小时前
C++高性能框架Drogon:后端开发新标杆
c++