题目描述
一个未经初始化的变量,里面存储的值可能是任意的。
因此直接使用未初始化的变量,比如将其赋值给另一个变量,并不符合一般的编程逻辑。
代码中出现这种情况,往往是因为遗漏了初始化语句、或是打错了变量名。
对代码中使用了未初始化变量的语句进行检查,可以方便地排查出代码中的一些隐秘 Bug。
考虑一段包含 $k$ 条赋值语句的简单代码。
该段代码最多使用到 $n$ 个变量,分别记作 $a_1, a_2, \\cdots, a_n$;该段代码使用的常量均记作 $a_0$。
第 $i$ 条($1 \\le i \\le k$)赋值语句为 $a_{x_i} = a_{y_i}$,满足 $1 \\le x_i \\le n$、$0 \\le y_i \\le n$,表示将 $a_{y_i}$ 的值赋给变量 $a_{x_i}$。
其中 $a_{x_i}$ 被称为该赋值语句的左值,一定是个变量;$a_{y_i}$ 被称为右值,可以是一个常量或变量。
对于任意一条赋值语句 $a_{x_i} = a_{y_i}$,如果右值 $a_{y_i}$ 是一个变量,则其应该在此之前被初始化过。
具体来说,如果变量 $a_{y_i}$ 在前 $i-1$ 条赋值语句中做为左值出现过,即存在 $j < i$ 满足 $x_j = y_i$(这里无需考虑第 $j$ 条赋值语句本身是否也有右值未初始化的问题),我们就认为在第 $i$ 条赋值语句中 $a_{y_i}$ 已被初始化;否则,我们认为该条语句存在右值未初始化的问题。
按照上述规则,试统计给定的代码中,有多少条赋值语句右值未被初始化。
输入格式
输入的第一行包含空格分隔的两个正整数 $n$、$k$,分别表示变量的数量和赋值语句的条数。
接下来输入 $k$ 行,其中第 $i$ 行($1 \\le i \\le k$)包含空格分隔的两个正整数 $x_i$、$y_i$,表示第 $i$ 条赋值语句。
纠错:其实 $y_i$ 可以等于 $0$,所以 $y_i$ 不一定是正整数(可参考样例),此为官网题面描述存在问题,特此指出。
输出格式
输出一个整数,表示有右值未被初始化问题的赋值语句条数。
数据范围
$50\\%$ 的测试数据满足 $0 < n, k \\le 1000$;
全部的测试数据满足 $0 < n, k \\le 10^5$,$1 \\le x_i \\le n$,$0 \\le y_i \\le n$。
输入样例:
10 7
1 2
3 3
3 0
3 3
6 2
2 1
8 2
输出样例:
3
样例解释
其中第一、二、五条赋值语句右值未被初始化。
C++代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int ans = 0;//如果int ans放在花括号外面那就可以不加 = 0,如果在花括号里面一定要加!
bool doge[N] = {0};
int main()
{
int k, n, x, y;
cin >> n >> k;
doge[0] = 1;
while (k --)
{
cin >> x >> y;
if(!doge[y])//特判一下
{
ans ++;//如果是那就ans ++
}
doge[x] = 1;//如果不是那就给doge[x] 赋值
}
printf("%d\n", ans);//输出答案
return 0;
}
Orz
。
短小精悍
tql
有亿点点简短难懂
hhh
hh
###请问我这么写怎么就不对呢?
//
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
int const N = 1e5 + 1;
int main()
{
int n, m;
bool st[N];
cin >> n >> m;
memset(st, false, sizeof (st));//bool st[5]={false};c++默认初始化bool数组的值为false
int res = 0;
// cout << m ;
int l, r;
while (m–)
{
}
//
你的问题是数组大小不能是未知的变量,只能是一个数字。还有就是boo数组的初始化memset(st,false,sizeof(st))
或者用bool st[N]={fasle};
对啊谢谢大佬
没事记得点个关注相互学习就行,嘿嘿嘿
求日历