题目链接:http://codeforces.com/contest/519/problem/B
这道题目有点像求两个集合的差集
一开始就是单纯的去想用短的那个集合去和大的集合去比较,算法也没有想着去优化
结果就超时了
超时代码也贴出来把hhhh
#include <cstdio> #include <cstring> #include <iostream> #include <cstdbool> using namespace std; int main() { int n; scanf("%d",&n); int a[n],b[n-1],c[n-2]; for (int i=0;i<n;i++) { scanf("%d",&a[i]); } for (int i=0;i<n-1;i++) { scanf("%d",&b[i]); } for (int i=0;i<n-2;i++) { scanf("%d",&c[i]); } for (int i=0;i<n-1;i++) { for (int j=0;j<n;j++) { if (b[i] == a[j]) { a[j] = 0; break; } } } for (int i=0;i<n;i++) { if (a[i] != 0) { printf("%d ",a[i]); } } for (int i=0;i<n-2;i++) { for (int j=0;j<n-1;j++) { if (c[i] == b[j]) { b[j] = 0; break; } } } for (int i=0;i<n-1;i++) { if (b[i] != 0) { printf("%d",b[i]); } } return 0; }
非常暴力的解法hh
后来想着去优化,就是先对集合元素排序,然后再进行比较。这样就可以减少算法的复杂度,不会出现n*n的复杂度
如果出现一个不匹配我们直接把它数出来就可以。
如果遍历到底也没出现不匹配的,就说明长集合的最后一个是不匹配的!(这算是一个特例吧,我们就进行一个特判)
AC代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdbool> using namespace std; int main() { int n; scanf("%d",&n); int a[n],b[n-1],c[n-2]; for (int i=0;i<n;i++) { scanf("%d",&a[i]); } for (int i=0;i<n-1;i++) { scanf("%d",&b[i]); } for (int i=0;i<n-2;i++) { scanf("%d",&c[i]); } sort(a,a+n); sort(b,b+n-1); sort(c,c+n-2); int p = 0; int l = 0; int i; for (i=0;i<n-1;i++) { p++; if (a[i] != b[i]) { printf("%d ",a[i]); break; } } if (p == i) { printf("%d ",a[p]); } for (i=0;i<n-2;i++) { l++; if (b[i] != c[i]) { printf("%d ",b[i]); break; } } if (l == i) { printf("%d ",b[l]); } return 0; }