CSP 202203-1

未初始化警告-题目描述

考虑一段包含 k 条赋值语句的简单代码。该段代码最多使用到 n 个变量,分别记作 a1,a2,⋯,an;该段代码使用的常量均记作 a0。

第 i 条(1≤i≤k)赋值语句为 axi=ayi,满足 1≤xi≤n、0≤yi≤n,表示将 ayi 的值赋给变量 axi。其中 axi 被称为该赋值语句的左值,一定是个变量;ayi 被称为右值,可以是一个常量或变量。

对于任意一条赋值语句 axi=ayi,如果右值 ayi 是一个变量,则其应该在此之前被初始化过。
具体来说,如果变量 ayi 在前 i−1 条赋值语句中做为左值出现过,即存在 j<i 满足 xj=yi(这里无需考虑第 j 条赋值语句本身是否也有右值未初始化的问题),我们就认为在第 i 条赋值语句中 ayi 已被初始化;
否则,我们认为该条语句存在右值未初始化的问题。

按照上述规则,试统计给定的代码中,有多少条赋值语句右值未被初始化。

输入格式

输入的第一行包含空格分隔的两个正整数 n、k,分别表示变量的数量和赋值语句的条数。

接下来输入 k 行,其中第 i 行(1≤i≤k)包含空格分隔的两个正整数 xi、yi,表示第 i 条赋值语句。

输出格式

输出一个整数,表示有右值未被初始化问题的赋值语句条数。

输入
10 7
1 2
3 3
3 0
3 3
6 2
2 1
8 2
输出
3
说明/提示
样例解释

其中第一、二、五条赋值语句右值未被初始化。

子任务

50% 的测试数据满足 0<n,k≤1000;

全部的测试数据满足 0<n,k≤105。


思路解析

没啥好说的,左侧没有出现过的值不能出现在右侧。

不过,Python中的list调用in方法是O(n)的,从1-n的O(n),时间复杂度就到O(n2)了。

这对于10^5的时间复杂度应该是不够用的。

所以,这里我用空间换时间,来个10^5的数组,把查找过程的时间复杂度降低为O(1),这样综合时间复杂度就可以达到O(n)了。

输入输出部分
#老规矩,先考虑输入输出
n, k = map(int,input().split())
ans = 0
#
# 核心代码
#
print(ans)
核心代码
markLeft = list([0] * 100000)[::]#声明一个标记数组
markLeft[0] = 1#题意所示,0为常数,不算做左值
for i in range(k):
    tmp_left, tmp_right = map(int,input().split())#输入
    if markLeft[tmp_right] == 0:#如果没有标记,计数
        ans += 1
    markLeft[tmp_left] = 1#标记
汇总代码
n, k = map(int,input().split())
ans = 0
markLeft = list([0] * 100000)[::]
markLeft[0] = 1
for i in range(k):
    tmp_left, tmp_right = map(int,input().split())
    if markLeft[tmp_right] == 0:
        ans += 1
    markLeft[tmp_left] = 1
print(ans)
评测链接

【CSP 202203-1】首页 - 计算机软件能力认证考试系统

最近的文章

CSP题单

本题单为CSP模拟考试题单。…

继续阅读
更早的文章

游戏说明

如题。…

继续阅读