深耕专业教研,探索前沿技术
信息技术来源:2025学年第二学期浙江省名校协作体高三试题

第 11 题

答案与解析

本题解析

参考答案

C

解题思路

列表非递减,程序每轮取区间中点,并根据比较结果缩小区间,采用对分查找。与找到相等元素便停止的写法不同,本程序在d[m]=key时仍执行else分支,继续向右查找。

程序分析

key = int(input())
i, j = 0, len(d) - 1
while i <= j:
    m = (i + j) // 2
    if d[m] > key:
        j = m - 1
    else:
        i = m + 1
print(j)

i、j初始为0、9,表示待查找区间的左右端点。若d[m]>key,由于列表非递减,m及其右侧元素都大于key,令j=m-1排除这部分;否则,m及其左侧元素都不大于key,令i=m+1继续寻找更靠右的位置。

因此,i左侧已确认不大于key,j右侧已确认大于key。循环在i>j时结束,此时两端点相邻,输出的j就是最后一个不大于key的元素下标;若所有元素都大于key,则输出-1。每执行一轮while循环,查找次数增加1。

选项分析

A

错误。图中d[3]至d[6]均为8,d[7]=10,所以最后一个不大于8的元素下标为6。实际访问的中点下标依次为4、7、5、6,共4次,最后i=7、j=6,输出6。

B

错误。取符合题意的d[0]、d[1]、d[2]依次为1、2、3,输入6时访问的中点下标依次为4、1、2、3,共4次,与输入8时相同,不能说一定更少。

C

正确。所有元素均为100以内的正整数,因此都不大于100。输入100时,最后一个满足条件的元素必为d[9],输出j=9。

D

错误。例如输入0,所有元素均大于key,中点下标依次为4、1、0,j依次更新为3、0、-1,只查找3次便结束。