みなさんこんにちは、ほむほむです。
今回はAtCoder Beginner Contest 168の問題A~問題Dまでの復習投稿です。
【問題A】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
N := getStdinInt()
switch {
case (N%10 == 2) ||
(N%10 == 4) ||
(N%10 == 5) ||
(N%10 == 7) ||
(N%10 == 9):
fmt.Printf("hon\n")
case (N%10 == 0) ||
(N%10 == 1) ||
(N%10 == 6) ||
(N%10 == 8):
fmt.Printf("pon\n")
case (N%10 == 3):
fmt.Printf("bon\n")
}
}
var sc = bufio.NewScanner(os.Stdin)
func getStdin() string {
sc.Scan()
return sc.Text()
}
func getStdinInt() int {
str := getStdin()
rtn, _ := strconv.Atoi(str)
return rtn
}
【問題B】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
K := getStdinInt()
S := getStdin()
if len(S) <= K {
fmt.Printf("%s\n", S)
} else {
fmt.Printf("%s%s\n", S[:K], "...")
}
}
var sc = bufio.NewScanner(os.Stdin)
func getStdin() string {
sc.Scan()
return sc.Text()
}
func getStdinInt() int {
str := getStdin()
rtn, _ := strconv.Atoi(str)
return rtn
}
【問題C】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
"strings"
)
func main() {
list := getStdinIntArr()
A := list[0]
B := list[1]
H := list[2]
M := list[3]
aPosM := 60*H + M // max 720
bPosM := M % 60 // max 60
bPosM = bPosM * (720 / 60) // to max 720
if aPosM == bPosM {
ans := math.Abs(float64(A) - float64(B))
fmt.Printf("%.19f\n", ans)
} else {
AFloat := float64(A)
BFloat := float64(B)
aPosRad := 2.0 * math.Pi * float64(aPosM) / 720.0
bPosRad := 2.0 * math.Pi * float64(bPosM) / 720.0
rad := math.Abs(aPosRad - bPosRad)
var ans float64 = 0
ans += AFloat * AFloat
ans += BFloat * BFloat
ans -= 2.0 * AFloat * BFloat * math.Cos(rad)
ans = math.Sqrt(ans)
fmt.Printf("%.19f\n", ans)
}
}
var sc = bufio.NewScanner(os.Stdin)
func getStdin() string {
sc.Scan()
return sc.Text()
}
func getStdinIntArr() []int {
str := getStdin()
list := strings.Split(str, " ")
rtn := make([]int, len(list))
for idx, val := range list {
rtn[idx], _ = strconv.Atoi(val)
}
return rtn
}
【問題D】
後ほど説明文を掲載します。
package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
"strings"
)
// Road is 通路構造体
type Road struct {
to []int
}
// Heya is 部屋構造体
type Heya struct {
depth int
prev int
}
func main() {
list := getStdinIntArr()
N := list[0]
M := list[1]
road := make([]Road, N) // 通路
heya := make([]Heya, N) // 部屋
// 通路初期化
for i := 0; i < N; i++ {
road[i].to = make([]int, 0)
}
// 通路
for i := 0; i < M; i++ {
list2 := getStdinIntArr()
A := list2[0]
B := list2[1]
A = A - 1 // 0スタートに直す
B = B - 1
road[A].to = append(road[A].to, B)
road[B].to = append(road[B].to, A)
}
// 部屋初期化
for i := 0; i < N; i++ {
if i == 0 {
heya[i].depth = 0
heya[i].prev = -1
} else {
heya[i].depth = math.MaxInt32
heya[i].prev = -1
}
}
// 0部屋から幅優先探索する
parent := []int{0}
for {
parentTmp := parent[:]
parent = parent[len(parent):]
for _, val := range parentTmp {
for _, to := range road[val].to {
if heya[to].prev != -1 {
continue
}
heya[to].depth = heya[val].depth + 1
heya[to].prev = val
parent = append(parent, to)
}
}
if len(parent) == 0 {
break
}
}
// 答え出力
fmt.Printf("Yes\n")
for idx, val := range heya {
if idx == 0 {
continue
}
fmt.Printf("%d\n", val.prev+1) // 1スタートに戻す
}
}
var sc = bufio.NewScanner(os.Stdin)
func getStdin() string {
sc.Scan()
return sc.Text()
}
func getStdinIntArr() []int {
str := getStdin()
list := strings.Split(str, " ")
rtn := make([]int, len(list))
for idx, val := range list {
rtn[idx], _ = strconv.Atoi(val)
}
return rtn
}