正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-S 2019 第一轮真题 › 第18题

CSP-S 2019 第一轮 第18题:若将第12行的“<”改为“!=”,程序输出的结果不会改变。(

阅读程序·判断 · 模拟与程序跟踪 · 答案 T

题目

#include <cstdio>
using namespace std;
int n;
int a[100];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    int ans = 1;
    for (int i = 1; i <= n; ++i) {
        if (i > 1 && a[i] < a[i - 1])
            ans = i;
        while (ans < n && a[i] >= a[ans + 1])
            ++ans;
        printf("%d\n", ans);
    }
    return 0;
}

本小题

若将第 12 行的 < 改为 !=,程序输出的结果不会改变。()

选项

  • T. 正确
  • F. 错误

答案

T

题解

选 T. 正确。第 12 行修改的是:

``cpp if (i > 1 && a[i] < a[i - 1]) ``

把 < 改成 != 后,只有 a[i] > a[i - 1] 时,两种程序的行为可能不同:

  • 原程序不执行 ans = i。
  • 修改后执行 ans = i。

但这两种操作最终效果相同。

关键是:处理完第 i - 1 个数时,ans 表示从该位置向右,遇到的第一个更大的数的前一位。当 a[i] > a[i - 1] 时,下一个数就更大,所以此时一定有:

``cpp ans == i - 1 ``

于是,原程序接下来执行 while,条件就是:

``cpp i - 1 < n && a[i] >= a[i] ``

条件成立,++ans 使 ans 变成 i,与修改后的 ans = i 完全一致,之后的循环也相同。

其余情况中,相等时两版都不重置,下降时两版都重置。因此,输出不会改变。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号