CCF: 202203-1 未初始化警告---C++

思路:就是对每一条赋值语句的右侧判断,循环看在这条赋值语句之前的赋值语句左侧有没有出现过这个右侧的值,但是只是单纯循环的话只有八十分,因为运行会超时,所以不能每次都循环判断前面所有的左侧,用了一个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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值