#6711. 尺取法专项练习 1

尺取法专项练习 1

1. 尺取法主要适合处理哪类问题 {{ select(1) }}

  • 连续区间问题
  • 全排列问题
  • 树形结构问题
  • 图论最短路问题

2. 尺取法一般使用几个指针进行操作 {{ select(2) }}

  • 两个
  • 一个
  • 三个
  • 四个

3. 以下关于尺取法时间复杂度正确的是 {{ select(3) }}

  • O(n)
  • O(n²)
  • O(logn)
  • O(n!)

4. 暴力枚举连续区间的时间复杂度高,尺取法作用是 {{ select(4) }}

  • 优化效率,降低时间复杂度
  • 增加代码长度
  • 只能处理小数组
  • 使逻辑更复杂

5. 在尺取法中,通常用来标记区间左端点的变量是 {{ select(5) }}

  • mid
  • k
  • r / right
  • l / left

6. 当区间条件不满足时,尺取法通常的操作是 {{ select(6) }}

  • 左指针左移
  • 左指针右移,缩小区间
  • 清空数组
  • 直接结束程序

7. 尺取法不能解决以下哪个问题 {{ select(7) }}

  • 最短连续子区间
  • 无序数组任意两数乘积
  • 区间和满足条件
  • 最长合法连续子串

8. 对于有序连续区间问题,尺取法相较于暴力枚举 {{ select(8) }}

  • 运行更快
  • 运行更慢
  • 效率一致
  • 只能小规模使用

9. 尺取法两个指针的移动特点是 {{ select(9) }}

  • 可随意左右移动
  • 只向右移动,不回头
  • 只向左移动
  • 固定不动

10. 尺取法在遍历过程中,数组遍历次数为 {{ select(10) }}

  • 两层循环多次
  • 仅一次
  • 随机次数
  • 固定三次

阅读以下代码:

#include <iostream>
using namespace std;
int a[100005];
int main()
{
    int n, x;
    cin >> n >> x;
    for(int i = 1; i <= n; i++) cin >> a[i];
    int l = 1, sum = 0, ans = 1e9;
    for(int r = 1; r <= n; r++)
    {
        sum += a[r];
        while(sum >= x)
        {
            ans = min(ans, r - l + 1);
            sum -= a[l];
            l++;
        }
    }
    cout << ans;
    return 0;
}

11. 本段代码使用尺取法思想求解问题 {{ select(11) }}

12. 变量 l 代表区间右端点 {{ select(12) }}

13. while 循环作用是不断缩小左边界,寻找最小区间 {{ select(13) }}

14. 代码中 sum 变量的作用是 {{ select(14) }}

  • 记录数组最大值
  • 记录当前区间总和
  • 统计元素个数
  • 记录答案

15. 该程序求解的问题是 {{ select(15) }}

  • 最长上升子序列
  • 区间元素个数
  • 和大于等于x的最短连续子区间
  • 数组最大值

16. 两个指针 l 和 r 的移动方向为 {{ select(16) }}

  • 只向左移动
  • 随意移动
  • 固定不变
  • 只向右移动

题目描述:利用尺取法,统计数组中不含重复数字的最长连续区间。

#include <iostream>
using namespace std;
int vis[1010];
int a[1010];
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    int l = 1, ans = 0;
    for(int r = 1; r <= n; r++)
    {
        while(vis[a[r]] == 1)
        {
            vis[_____(1)_____] = 0;
            l++;
        }
        vis[a[r]] = _____(2)_____;
        ans = max(ans, _____(3)_____);
    }
    cout << ans;
    return 0;
}

17. 程序第 (1) 处应填入? {{ select(17) }}

  • a[r]
  • a[l]
  • l
  • r

18. 程序第 (2) 处应填入? {{ select(18) }}

  • 0
  • -1
  • 1
  • a[r]

19. 程序第 (3) 处应填入? {{ select(19) }}

  • l - r
  • r + l
  • r - l + 1
  • a[r]

20. 数组 vis 的作用是 {{ select(20) }}

  • 存储区间和
  • 标记数字是否在当前区间
  • 记录指针位置
  • 统计数组长度

21. 该题型属于尺取法经典的 {{ select(21) }}

  • 区间求和模型
  • 最值查找模型
  • 排序模型
  • 去重区间模型