package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func main() {
input := bufio.NewReader(os.Stdin)
var testCase int
_, err := fmt.Fscan(input, &testCase)
if err != nil {
}
for testCase > 0 {
testCase--
var x int
_, err := fmt.Fscan(input, &x)
if err != nil {
}
var a = make([]int, 4*x)
var l = make([]int, 0)
var lMap = make(map[int]int)
for i := 0; i < 4*x; i++ {
_, err := fmt.Fscan(input, &a[i])
if err != nil {
}
_, ok := lMap[a[i]]
if ok {
lMap[a[i]] ++
} else {
lMap[a[i]] = 1
}
}
var result = true
for k, v := range lMap {
if v%2 != 0 {
result = false
break
}
for i := 0; i < v/2; i++ {
l = append(l, k)
}
}
if result == false {
fmt.Println("NO")
continue
}
sort.Ints(l)
r := l[0] * l[2*x-1]
for i := 1; i < x; i++ {
if l[i]*l[2*x-i-1] != r {
result = false
break
}
}
if result == false {
fmt.Println("NO")
} else {
fmt.Println("YES")
}
}
}
A 题
题意:一堆有学号的小学生排队玩游戏,只有学号是增序或降序就赢了。。限制是:学号是 1~n 之间,总共 n 个人。 思路:一个 for 循环排呗,先检查是否升序,再检查是否降序。需要注意的是,..., n, 1, ... 算增序;..., 1, n, ... 算升序。
B 题
题意:给定
4*n
条边长,求问是否能组成 n 个矩形,且其面积相等。 思路:先找出所有出现过两次的边长,组成一个2*n
的数组,若一个边长只出现过一次,直接 “NO”;再将这个数组排序,收尾相乘,看乘机是否相等,相等就 “YES”,不相等就 “NO”.