package main import ( "bufio" "fmt" "os" "sort" ) func minProduct(scanner *bufio.Scanner) []int64 { caseCnt := ReadInt(scanner) // Math AGAIN. answer := make([]int64, caseCnt) for i := 0; i < caseCnt; i++ { // n = 2 is a very impotant case, because: // if x < x', y < y', then xy'+x'y - xy - x'y' // = -(x' - x)(y' - y) < 0, so xy'+x'y < xy + x'y' vecDim := ReadInt(scanner) vec1 := ReadInts(scanner) vec2 := ReadInts(scanner) sort.Ints(vec1) sort.Ints(vec2) for j := 0; j < vecDim; j++ { answer[i] += int64(vec1[j] * vec2[vecDim-1-j]) } } return answer } func main() { inputFiles := []string{"A-small-practice.in", "A-large-practice.in", "test.in"} outputFiles := []string{"result-small.out", "result-large.out", "test.out"} const ( small = iota large test ) fileType := large fin, _ := os.Open(inputFiles[fileType]) defer fin.Close() scanner := bufio.NewScanner(fin) answer := minProduct(scanner) fout, _ := os.Create(outputFiles[fileType]) defer fout.Close() for i, n := range answer { s := fmt.Sprintf("Case #%d: %d\n", i+1, n) fout.WriteString(s) } }