前言
也有推荐书目的,在这里也推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下
「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd=6vdq# 提取码:6vdq”复制这段内容后打开手机迅雷App,查看更方便」
其他内容系列前面几篇都有,就不再搞了。
希望有大神能够提供改良意见,敬礼!
---------------------------------------------------------------------------------------------------------------------------------
题目
【题目描述】
【输入格式】
【输出格式】
输出一个整数,表示有右值未被初始化问题的赋值语句条数。
【样例 1 输入】
10 7
1 2
3 3
3 0
3 3
6 2
2 1
8 2
【样例 1 输出】
3
【样例 1 解释】
其中第一、二、五条赋值语句右值未被初始化。
【样例 2 输入】
【样例 2 输出】
【样例 2 解释】
【子任务】
思路分析:
本题的思想比较简单,
使用一个数组来存储n个值,第几个数下标就是几,bool型,每个赋值语句都要把下标为左值的bool型变量改成true,象征已经被赋值了。
如果语句中以右值为下标的bool型变量的值为false,就意味着该赋值语句存在未被初始化的问题。Result++。
在题中案例1里有一个3,0的特殊案例,原因是左值右值表示的都不是数,而是第左值\右值个变量,不会有第0个变量,所以0就是一个单纯的数值,并不能算右值。
代码如下:
#include <bits/stdc++.h>//万能头文件
using namespace std;
int main() {
int n=0;//n是数字的范围(数组长度)
int k=0;//赋值语句数,循环条件i
int resultsum=0;//存储结果
//const int N=10000;
cin>>n>>k;
bool b[n+1]; //判断是否已经被赋值了,没有就是0,有就是1
b[0]=true;
for(int i=1;i<n+1;i++){
b[i]=false;
}
//样例中存在一个3,0不算右值未赋值,因为前面的i的范围是1开始的,不包括0,0就单纯的作为一个值了
//输入
int left;
int right;
for(int i=0;i<k;i++){
cin>>left>>right;
if(b[right]==false){
resultsum++;//右值为false
}
b[left]=true;//左值被赋值,变为true
}
cout<<resultsum<<endl;
return 0;
}