【Go言語】AtCoder ABC168 復習(問題A~問題D)

投稿者: | 2020年7月3日

みなさんこんにちは、ほむほむです。
今回は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
}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください