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选手每次最多只能修改一个错误。

一定要注意一串数字中有可能有很多重复的数字,所以我刚开始就是用set错到了这里。

#include<stdio.h>
#include<algorithm>
#include<vector>

using namespace std;

vector < int > vec1;
vector < int > vec2;
vector < int > vec3;

int main()
{
    int n;
    while (~scanf ("%d", &n))
    {
        int a;
        for (int i = 0; i < n; i++)
        {
            scanf ("%d", &a);vec1.push_back(a);
        }
        for (int i = 0; i < n-1; i++)
        {
            scanf ("%d", &a);vec2.push_back(a);
        }
        for (int i = 0; i < n-2; i++)
        {
            scanf ("%d", &a);vec3.push_back(a);
        }
        sort(vec1.begin(), vec1.end());
        sort(vec2.begin(), vec2.end());
        sort(vec3.begin(), vec3.end());
        int i;
        for( i = 0; i < n-1; i ++)
        {
            if (vec1[i] != vec2[i])
            {
                printf ("%d\n", vec1[i]); break;
            }
        }
        if(i == n-1) printf ("%d\n", vec1[n-1]);
        for( i = 0; i < n-2; i ++)
        {
            if (vec2[i] != vec3[i])
            {
                printf ("%d\n", vec2[i]); break;
            }
        }
        if(i == n-2) printf ("%d\n", vec2[n-2]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hqzzbh/article/details/81149576