codeforces 779A

17 篇文章 0 订阅

更好的阅读体验

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。

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

【代码】

#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zuhiul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值