思路:就是对每一条赋值语句的右侧判断,循环看在这条赋值语句之前的赋值语句左侧有没有出现过这个右侧的值,但是只是单纯循环的话只有八十分,因为运行会超时,所以不能每次都循环判断前面所有的左侧,用了一个Inited数组,来记录已经确定是初始化过的变量,下次判断右侧的时候先看看这个数组里的对应的值是否为1,为1代表已经初始化过了,就不需要再循环判断了
#include <iostream>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;//n个变量
int k;//k条赋值语句
cin>>n>>k;
int left[100001];//赋值语句左边
int right[100001];//赋值语句右边
for(int i=1;i<=k;i++)
{
cin>>left[i]>>right[i];
}
int noSum=0;//记录右边未初始化的赋值语句个数
int flag=0;
int Inited[100001]={0}; //记录已经被初始化过的变量
for(int i=1;i<=k;i++)//对每一条赋值语句的右边分析
{
if(right[i]==0)//右边是常数,无所谓,表示直接初始化了
{
Inited[right[i]]=1;
}
else
{
flag=0;
if(Inited[right[i]]==1)//被记录是初始化过的,不用再判断了
{
flag=1;
}
else
{
for(int j=1;j<i;j++)
{
if(left[j]==right[i])
{
flag=1;//记录是初始化过的
Inited[right[i]]=1;
break;//初始化过的
}
}
}
if(flag==0) noSum++;//没有被初始化的
}
Inited[left[i]]=1;//不论右侧如何,左侧的变量都能说是初始化过的
}
cout<<noSum;
return 0;
}
下面是80分/90分代码,就是没有记录已经初始化过变量的代码:
#include <iostream>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;//n个变量
int k;//k条赋值语句
cin>>n>>k;
int left[100001];//赋值语句左边
int right[100001];//赋值语句右边
for(int i=1;i<=k;i++)
{
cin>>left[i]>>right[i];
}
int noSum=0;//记录右边未初始化的赋值语句个数
int flag=0;
for(int i=1;i<=k;i++)//对每一条赋值语句的右边分析
{
if(right[i]==0)//右边是常数,无所谓,表示直接初始化了
{
}
else
{
flag=0;
for(int j=1;j<i;j++)
{
if(left[j]==right[i])
{
flag=1;//记录是初始化过的
break;//初始化过的
}
}
if(flag==0) noSum++;//没有被初始化的
}
}
cout<<noSum;
return 0;
}