您的位置:首页 > 其它

codeforces 779A

2017-04-24 23:32 281 查看
In Berland each high school student is characterized by academic performance — integer value between 1 and 5.

In high school 0xFF there are two groups of pupils: the group A and the group B. Each group consists of exactly n students. An academic performance of each student is known — integer value between 1 and 5.

The school director wants to redistribute students between groups so that each of the two groups has the same number of students whose academic performance is equal to 1, the same number of students whose academic performance is 2 and so on. In other words, the purpose of the school director is to change the composition of groups, so that for each value of academic performance the numbers of students in both groups are equal.

To achieve this, there is a plan to produce a series of exchanges of students between groups. During the single exchange the director selects one student from the class A and one student of class B. After that, they both change their groups.

Print the least number of exchanges, in order to achieve the desired equal numbers of students for each academic performance.


Input

The first line of the input contains integer number n (1 ≤ n ≤ 100) — number of students in both groups.

The second line contains sequence of integer numbers a1, a2, ..., an (1 ≤ ai ≤ 5), where ai is academic performance of the i-th student of the group A.

The third line contains sequence of integer numbers b1, b2, ..., bn (1 ≤ bi ≤ 5), where bi is academic performance of the i-th student of the group B.


Output

Print the required minimum number of exchanges or -1, if the desired distribution of students can not be obtained.


Example

Input

4
5 4 4 4
5 5 4 5

Output

1

Input

6
1 1 1 1 1 1
5 5 5 5 5 5

Output

3

Input

1
5
3

Output

-1

Input

9
3 2 5 5 2 3 3 3 2
4 1 4 1 1 2 4 4 1

Output

4


【题意】给你一个数字,表示了两个数组的长度,要让两个数组里面的数字经过有限次交换之后拥有各种数字的个数相等。比如第一个测例,只要第一数组的4和第五个数组的5交换后就是两个数组都是两个4,两个5。

【小想法】看题意可以知道数字只能是1~5之间,然后数组的顺序和结果没有关系,所以就不用把数字全部存起来,只用统计1~5出现的次数就可以了。这里有两个数组但是不用开三个数组(两个用来存数组,剩下一个用来存两个的和),后来想了想两个数组可以算出第三个数组。最后的结果就是两个数组之间的差距。

【代码】

#include <bits/stdc++.h>

using namespace std;
int num[10],sum[10];//第一个数组用来存储第一个数组的各个数字个数,第二个用来存储两个数组的和
int main()
{
int n;
scanf("%d",&n);
int c;
for(int i=0;i<n;i++)
{
scanf("%d",&c);
num[c]++;
sum[c]++;
}
for(int i=0;i<n;i++)
{
scanf("%d",&c);
sum[c]++;
}
int flag=1;//用来判断是否有数据只出现了奇数次,因为如果有的数据出现了奇数次,那么两个数组一定不能平分
for(int i=1;i<6;i++)
{
if(sum[i]&1)//判断是否有数据只出现了一次
{
flag=0;
printf("-1\n");
break;
}
sum[i]/=2;//除过之后的sum数组就是平均后的理想数组
}
if(flag)
{
int ans=0;
for(int i=1;i<6;i++)
ans+=abs(num[i]-sum[i]);//统计第一个数组和理想数组的距离,因为是两个数组之间的交换,所以和理想数组的差距就是交换次数,无论是多了还是少了。
printf("%d\n",ans/2);//因为每次交换是两个数据之间的,所以最后的答案要除以2
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces