CCF-CSP真题《202203-1—未初始化警告》思路+python,c++满分题解

 想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全

试题编号: 202203-1
试题名称: 未初始化警告
时间限制: 1.0s
内存限制: 512.0MB
问题描述:

题目背景

一个未经初始化的变量,里面存储的值可能是任意的。因此直接使用未初始化的变量,比如将其赋值给另一个变量,并不符合一般的编程逻辑。代码中出现这种情况,往往是因为遗漏了初始化语句、或是打错了变量名。对代码中使用了未初始化变量的语句进行检查,可以方便地排查出代码中的一些隐秘 Bug。

问题描述

考虑一段包含 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 否则,我们认为该条语句存在右值未初始化的问题。

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

输入格式

输入的第一行包含空格分隔的两个正整数 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

全部的测试数据满足 0

真题来源:未初始化警告

 感兴趣的同学可以进去进行练习提交

解题思路:

        本题利用了集合set的add方法来对变量进行存储add方法进行添加元素有一个好处,就是如果添加的元素在集合中已存在,则不执行任何操作,这样就保证set中的值不会重复。

满分题解: 

n, k = map(int,input().split())
#两个正整数n, k,分别表示变量的数量和赋值语句的条数
num = [[i for i in map(int,input().split())] for j in range(k)]
#输入k行数据,每行两个正整数x,y
temp = set()
#建立一个集合来存储已经出现的变量
time = 0
#表示右值未被初始化问题的赋值语句条数
for i in range(k):
    if num[i][1]!=0 and num[i][1] not in temp:
    #找到右值未被初始化问题的赋值语句
        time += 1
        #右值未被初始化问题的赋值语句+1
    temp.add(num[i][0])
    #将出现的变量加入temp集合中
    if len(temp)>n:
    #当temp中的值已经达到n+1个时,表示所有变量已赋值,退出循环
        break
print(time)

运行结果: 


c++满分题解:

#include 
using namespace std;
const int N=1e5+10;
bool q[N];
int n,k;
int x,y;
int res;
 
int main(){
    q[0]=true;
    cin >>n>>k;
    while(k--){
        cin >>x>>y;
        if(!q[y])  res++; 
        q[x]=true;
    }
    cout <

 运行结果: ​​​​​​​

 

你可能感兴趣的:(算法题练习,python,csp,1024程序员节,c++)