正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-S 2019 第一轮真题 › 第18题
CSP-S 2019 第一轮 第18题:若将第12行的“<”改为“!=”,程序输出的结果不会改变。(
题目
#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号