Problem:
Score : 300 points

Problem Statement

A sequence a_1,a_2,... ,a_n is said to be /\/\/\/ when the following conditions are satisfied:

For each i = 1,2,..., n-2, a_i = a_{i+2}.

Exactly two different numbers appear in the sequence.

You are given a sequence v_1,v_2,...,v_n whose length is even.
We would like to make this sequence /\/\/\/ by replacing some of its elements.
Find the minimum number of elements that needs to be replaced.

Constraints

2 \leq n \leq 10^5

n is even.

1 \leq v_i \leq 10^5

v_i is an integer.

Input

Input is given from Standard Input in the following format:

n
v_1 v_2 ... v_n

Output

Print the minimum number of elements that needs to be replaced.

Sample Input 1

4
3 1 3 2

Sample Output 1

1

The sequence 3,1,3,2 is not /\/\/\/, but we can make it /\/\/\/ by replacing one of its elements: for example, replace the fourth element to make it 3,1,3,1.

Sample Input 2

6
105 119 105 119 105 119

Sample Output 2

0

The sequence 105,119,105,119,105,119 is /\/\/\/.

Sample Input 3

4
1 1 1 1

Sample Output 3

2

The elements of the sequence 1,1,1,1 are all the same, so it is not /\/\/\/.

Solution in Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

////////////////////////////////////////
///        templates                 ///
////////////////////////////////////////

var sc = bufio.NewScanner(os.Stdin)

func nextLine() string {
	sc.Scan()
	return sc.Text()
}

var rdr = bufio.NewReaderSize(os.Stdin, 1000000)

func readBigLine() string {
	buf := make([]byte, 0, 1000000)
	for {
		l, p, e := rdr.ReadLine()
		if e != nil {
			panic(e)
		}
		buf = append(buf, l...)
		if !p {
			break
		}
	}
	return string(buf)
}

func strSprit(str string) []string {
	cols := strings.Split(str, " ")
	return cols
}

func parseInt(str string) int {
	n, _ := strconv.Atoi(str)
	return n
}

func intSprit(str string) []int {
	strs := strSprit(str)
	cols := make([]int, len(strs))
	for i, v := range strs {
		cols[i] = parseInt(v)
	}
	return cols
}

////////////////////////////////////////
///        end templates             ///
////////////////////////////////////////

func calcs(m map[int]int) (c, max, mn int) {
	c, max, mn = 0, 0, 0
	for k, v := range m {
		if max < v {
			max = v
			mn = k
		}
		c += v
	}
	return c, max, mn
}

func main() {
	line := readBigLine()

	N := parseInt(line)

	ll := readBigLine()
	v := intSprit(ll)

	oddm := make(map[int]int, N)
	evem := make(map[int]int, N)

	for i := 0; i < N; i++ {
		if i%2 == 0 {
			if _, ok := evem[v[i]]; !ok {
				evem[v[i]] = 1
			} else {
				evem[v[i]]++
			}

		} else {
			if _, ok := oddm[v[i]]; !ok {
				oddm[v[i]] = 1
			} else {
				oddm[v[i]]++
			}
		}
	}

	ec, emax, emn := calcs(evem)

	oc, omax, omn := calcs(oddm)

	if emn == omn {
		if ec == emax && oc == omax {
			fmt.Println(N / 2)
			return
		}
		if emax > omax {
			t := omax
			oddm[omn] = 0
			oc, omax, omn = calcs(oddm)
			fmt.Println(ec - emax + oc - omax + t)
			return
		} else if emax <= omax {
			t := emax
			evem[emn] = 0
			ec, emax, emn = calcs(evem)
			fmt.Println(ec - emax + oc - omax + t)
			return
		}
	} else {
		fmt.Println(ec - emax + oc - omax)
		return
	}

}