CodeForces - 519B A and B and Compilation Errors

A和B正在准备即将到来的信息学全国联赛。

B非常喜欢写程序。写完程序以后,他必须先编译代码。

最初,编译器显示有Ñ个编译错误,其中每一个被表示为一个正整数。经过一番努力,B设法解决一个错误,然后又编译了下,又改正了一个错误。

B可以完全肯定,他纠正了两个错误,但他忘记了是哪几个编译错误消失了。 

你能帮助B来找出那两个已经被改正的错误么?

Input

输入的第一行包含整数n(3≤n≤10^ 5) - 表示编译错误的初始数量。

第二行包含n个空格分隔的整数a1,a2,...,an(1≤ai≤10^9),表示第一次编译的时候出现的n个编译错误的序号。

第三行包含n-1个空格分开的整数b1,b2,......,bn-1,表示改正了一个错误以后,第二次编译中显示的错误。保证第三行中的所有数字都是第二行中的所有数字,除了一个被改正了的错误。

第四行有n-2空格分开的整数c1, c2,..., cn-2,表示在又改正了一个错误之后,第三次编译显示的错误。保证在第四行的所有数字都是来自第三行的,除了被改正的那个错误。

Output

输出只有两行,第一行输出一个整数,表示第一次被改正的错误的序号,第二行也输出一个整数,表示第二次被改正的错误的序号。题目保证输入数据都是正确的。

Sample Input

输入样例1:

5

1 5 8 123 7

123 7 5 1

5 1 7

输入样例2:

6

1 4 3 3 5 7

3 7 5 4 3

4 3 7 5

Sample Output

输出样例1:

8

123

输出样例2:

1

3

Hint

注意如果有相同序号的编译错误同时出现,B选手每次最多只能修改一个错误。

解题思路:比较一下三行输入编译信息,是不是上面一行比下面一行多了一个 数,是不是灵感来了,所以我们可以定义三个sum变量,来储存三次输入数据之和,相减即得结果。因为在学STL,所以我用STL相关内容又写了一遍代码

AC代码:

代码一:sum求和相减

#include<iostream>
using namespace std;
int main()
{
	long long sum1=0,sum2=0,sum3=0,n,x;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>x;
		sum1+=x;
	}
	for(int i=0;i<n-1;i++)
	{
		cin>>x;
		sum2+=x;
	}
	for(int i=0;i<n-2;i++)
	{
		cin>>x;
		sum3+=x;
	}
	cout<<sum1-sum2<<endl<<sum2-sum3<<endl;
	return 0; 
}

代码二:STL:因为油重复,而且三次输入数据的顺序不一致,所以想到了map容器

#include<iostream>
#include<map>
using namespace std;
const int maxn=1e5+20;
int main()
{
	int a[maxn];
	map<int,int> a1;//第一次输入数据 
	map<int,int> a2;//第二次 
	map<int,int> a3;//第三次 
	int n,x;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];//建立数组是为了减少后面找结果的循环量 
		a1[a[i]]++;
	}
	for(int i=0;i<n-1;i++)
	{
		cin>>x;
		a2[x]++;
	}
	for(int i=0;i<n-2;i++)
	{
		cin>>x;
		a3[x]++;
	}
	for(int i=0;i<n;i++)//因为用数组储存,只需循环到n就可以了 
	{
		if(a1[a[i]]!=a2[a[i]])
		{
			cout<<a[i]<<endl;
			a2[a[i]];//这一步很重要,没有会错,因为第二步中对于a[i]中的数据有一个没有加进a2中,方便后面找第二个结果 
			break;
		}
	} 
	for(int i=0;i<n;i++)
	{
		if(a2[a[i]]!=a3[a[i]])
		{
			cout<<a[i]<<endl;
			break;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40707370/article/details/82254482