未初始化警告-题目描述
考虑一段包含 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】首页 - 计算机软件能力认证考试系统