package main
import (
"fmt"
"sort"
)
func min(a, b, c int) int {
if a <=b && a <=c {
return a
} else if b <= a && b <= c {
return b
}
return c
}
func solve(C1, C2 []int) int {
// 合并并统计频次
count := make(map[int]int)
globalMin := C1[0]
for _, x := range C1 {
count[x]++
if x < globalMin {
globalMin = x
}
}
for _, x := range C2 {
count[x]++
if x < globalMin {
globalMin = x
}
}
// 检查是否所有频次为偶数
for _, cnt := range count {
if cnt%2 != 0 {
return -1
}
}
// 构造目标:每个值出现 cnt/2 次
target := []int{}
for x, cnt := range count {
for i := 0; i < cnt/2; i++ {
target = append(target, x)
}
}
sort.Ints(target)
// 统计 C1 中每个值的实际频次
cnt1 := make(map[int]int)
for _, x := range C1 {
cnt1[x]++
}
// 找出 C1 中多出的元素
excess1 := []int{}
for _, x := range target {
if cnt1[x] > 0 {
cnt1[x]--
} else {
excess1 = append(excess1, x)
}
}
// C2 同理
cnt2 := make(map[int]int)
for _, x := range C2 {
cnt2[x]++
}
excess2 := []int{}
for _, x := range target {
if cnt2[x] > 0 {
cnt2[x]--
} else {
excess2 = append(excess2, x)
}
}
// 应该相等
if len(excess1) != len(excess2) {
return -1 // 理论上不会发生
}
k := len(excess1)
if k == 0 {
return 0
}
// 贪心配对:排序后一一配对
sort.Ints(excess1) // 升序
sort.Sort(sort.Reverse(sort.IntSlice(excess2))) // 逆序
cost := 0
for i := 0; i < k; i++ {
cost += min(2*globalMin, excess1[i], excess2[i]) // 小配大,或中介
}
return cost
}
func main() {
var M int
fmt.Scanf("%d", &M)
C1 := make([]int, M)
C2 := make([]int, M)
for i := 0; i < M; i++ {
fmt.Scanf("%d", &C1[i])
}
for i := 0; i < M; i++ {
fmt.Scanf("%d", &C2[i])
}
result := solve(C1, C2)
fmt.Println(result)
}