package main import . "fmt" func main() { var n int Scan(&n) vs := make([]int, n) for i := range vs { vs[i] = i+1 } ls := make([]int, 0, n*(n-1)/2) rs := make([]int, 0, n*(n-1)/2) for len(vs) > 1 { v := vs[0] vs = vs[1:] for _, e := range vs { ls = append(ls, v) rs = append(rs, e) } vs = vs[1:] } Println(len(ls)) for i := range ls { Println(ls[i], rs[i]) } } /* 考察 わからない 雑な発想 Nの頂点の集合V とする [1] 集合Vの頂点を1個選び、その頂点とそれ以外の頂点を連結する [2] 集合Vの中で次数が最小の頂点1個と最大の頂点1個を集合Vから取り除く [3] 集合Vの頂点が1個以下になるまで[1],[2]を繰り返す でどうだ? これが最適かはわからないのでWA覚悟 */