万卷网 > 题目详情
题型:组合题

(归并第 k 小)已知两个长度均为 n 的有序数组 a1 和 a2(均为递增序,但不保证严格单调递增),并且给定正整数 k(1≤k≤2n),求数组 a1 和 a2 归并排序后的数组里第 k 小的数值。

试补全程序。

#include <bits/stdc++.h> 

using namespace std; 


int solve(int *a1, int *a2, int n, int k) { 

  int left1 = 0, right1 = n - 1; 

  int left2 = 0, right2 = n - 1; 

  while (left1 <= right1 && left2 <= right2) { 

    int m1 = (left1 + right1) >> 1; 

    int m2 = (left2 + right2) >> 1; 

    int cnt =     ①     

    if (     ②     ) { 

      if (cnt < k) left1 = m1 + 1; 

      else right2 = m2 - 1; 

    } else {

      if (cnt < k) left2 = m2 + 1; 

      else right1 = m1 - 1; 

    }

  }

  if (     ③     ) { 

    if (left1 == 0) {

      return a2[k - 1]; 

    } else {

      int x = a1[left1 - 1],      ④     

      return std::max(x, y);

    }

  } else {

    if (left2 == 0) {

      return a1[k - 1]; 

    } else {

      int x = a2[left2 - 1],      ⑤     

      return std::max(x, y);

    }

  }

(1).

④处应填( )

A.

y = a1[k - left2 - 1]

B.

y = a1[k - left2]

C.

y = a2[k - left1 - 1]

D.

y = a2[k - left1]

(2).

③处应填( )

A.

left1 == right1

B.

left1 < right1

C.

left1 > right1

D.

left1 != right1

(3).

①处应填( )

A.

(m1 + m2) * 2

B.

(m1 - 1) + (m2 - 1)

C.

m1 + m2

D.

(m1 + 1) + (m2 + 1)

(4).

⑤处应填( )

A.

y = a1[k - left2 - 1]

B.

y = a1[k - left2]

C.

y = a2[k - left1 - 1]

D.

 y = a2[k - left1]

(5).

②处应填( )

A.

a1[m1] == a2[m2]

B.

a1[m1] <= a2[m2]

C.

a1[m1] >= a2[m2]

D.

a1[m1] != a2[m2]

更新时间:2022-12-07 16:25:48 |
【知识点】 CCF非专业级别软件能力认证CSP-S/提高级

相似题推荐

简答题

T4员工招聘

2026-04-17
简答题

T1社团招新

2026-04-17
简答题

T2道路修复

2026-04-17
简答题

T3谐音替换

2026-04-16
单选题

对一个大小为16(下标0-15)的数组构建满线段树,查询区间[3,11]时,最少需要访问多少个树结点(包括路径上的父结点和完全包含在查询区间内的结点)?

A.

7

B.

8

C.

9

D.

10

2025-10-17
公众号
客服 反馈
顶部