晩夏は特に関係ないです。
早速やっていき。
🐬 ABC 086 A - Product (100 点)
// ABC 086 A - Product
package main
import (
"fmt"
)
func main() {
var a, b int
fmt.Scanf("%d %d", &a, &b)
if (a*b)%2 == 0 {
fmt.Println("Even")
} else {
fmt.Println("Odd")
}
}
📝メモ
Odd
をOdds
とtypoしてWA出したけど内緒。
fmt.Scan
は遅いらしいがとりあえずはまだ影響出るレベルではない。
そうなったとき考える。
--参考--
Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 - Qiita
🐬 ABC 081 A - Placing Marbles (100 点)
// ABC 081 A - Placing Marbles
package main
import (
"fmt"
)
func main() {
var str string
fmt.Scan(&str)
cnt := 0
for i := 0; i < len(str); i++ {
if str[i] == '1' {
cnt++
}
}
fmt.Print(cnt)
}
📝メモ
与えられるのが数字列と決まっているでやりやすい。
🐬 ABC 081 B - Shift Only (200 点)
// ABC 081 B - Shift Only
package main
import "fmt"
func main() {
var n, cnt int
var a []int
fmt.Scan(&n)
a = make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&a[i])
}
flag := true
for flag {
for i := 0; i < n; i++ {
if a[i]%2 == 0 {
a[i] /= 2
} else {
flag = false
}
}
if flag {
cnt++
}
}
fmt.Print(cnt)
}
📝メモ
for flag
で無限ループ。
すべてが偶数であれば
を一つでも偶数があれば
と読み間違えてWAを出した。
🐬 ABC 087 B - Coins (200 点)
// ABC 087 B - Coins
package main
import "fmt"
func main() {
var A, B, C, X, cnt int
fmt.Scan(&A, &B, &C, &X)
for a := 0; a <= A; a++ {
for b := 0; b <= B; b++ {
for c := 0; c <= C; c++ {
if a*500+b*100+c*50 == X {
cnt++
}
}
}
}
fmt.Println(cnt)
}
📝メモ
全探索。三重ループは見るだけで心的負荷が高い。
🐬 ABC 083 B - Some Sums (200 点)
// ABC 083 B - Some Sums
package main
import (
"fmt"
"log"
)
func main() {
var n, a, b, total int
fmt.Scan(&n, &a, &b)
for i := 1; i < (n + 1); i++ {
var x [3]int
var y int
if i >= 1000 {
x[0] = i / 1000
}
if i >= 100 {
x[1] = i / 100
}
if i >= 10 {
x[2] = i / 10
}
y = i - x[0]*1000 - x[1]*100 - x[2]*10
res := x[0] + x[1] + x[2] + y
if res >= a && res <= b {
total += i
log.Printf("n = %d -> res:%d", i, res)
}
}
fmt.Print(total)
}
📝メモ
これもA以上B以下
の条件をAorBに等しくなる
と取り間違えて最初にWAを出してしまった。途中のデバッグログは反省として消さずに残しておく。
🐬 ABC 088 B - Card Game for Two (200 点)
// ABC 088 B - Card Game for Two
package main
import (
"fmt"
"sort"
)
func main() {
var n, a int
fmt.Scan(&n)
arr := make([]int, n)
for i := range arr {
fmt.Scan(&a)
arr[i] = a
}
sort.Sort(sort.Reverse(sort.IntSlice(arr)))
var alice, bob int
for i := range arr {
if i%2 == 0 {
alice += arr[i]
} else {
bob += arr[i]
}
}
fmt.Println(alice-bob)
}
📝メモ
sort packageを使って解決。(降順にする方法がわからずに調べた。)
golangのsortに関してはいろいろ気になるところがあったので後日また記事にする。
🐬 ABC 085 B - Kagami Mochi (200 点)
// ABC 085 B - Kagami Mochi
package main
import "fmt"
func main() {
var n int
fmt.Scan(&n)
d := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&d[i])
}
p := make(map[int]int)
for v := range d {
p[d[v]]++
}
fmt.Println(len(p))
}
📝メモ
mapを使ってカウント。問題の意図を間違えなければ非常に単純。
🐬 ABC 085 C - Otoshidama (300 点)
// ABC 085 C - Otoshidama
package main
import "fmt"
func main() {
var n, y int
fmt.Scan(&n, &y)
for i := 0; i <= n; i++ {
for j := 0; j <= (n - i); j++ {
k := n - (i + j)
total := 10000*i + 5000*j + 1000*k
if total == y {
fmt.Println(i, j, k)
return
}
}
}
fmt.Println(-1, -1, -1)
}
📝メモ
素直にやったらTLEになりそうだったのでちょっと工夫した。
🐬 ABC 049 C - Daydream (300 点)
// ABC 049 C - Daydream
package main
import (
"fmt"
"strings"
)
func main() {
var s string
fmt.Scan(&s)
s = reverse(s)
s = strings.Replace(s, "resare", "", -1)
s = strings.Replace(s, "esare", "", -1)
s = strings.Replace(s, "remaerd", "", -1)
s = strings.Replace(s, "maerd", "", -1)
var res string
if len(s) == 0 {
res = "YES"
} else {
res = "NO"
}
fmt.Println(res)
}
func reverse(s string) string {
rs := []rune(s)
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
rs[i], rs[j] = rs[j], rs[i]
}
return string(rs)
}
📝メモ
文字列の反転。自前で実装する必要があった。ただindexを見て反転させていくとバイト列なのでぐちゃぐちゃになってしまう。runeを使う。
--参考--
Go言語で文字列を逆順に並び替える - Misc Notes
🐬 ABC 086 C - Traveling (300 点)
// ABC 086 C - Traveling
package main
import (
"fmt"
"math"
)
func main086C() {
var n int
fmt.Scan(&n)
var t int
var x, y float64
t, x, y = 0, 0.0, 0.0 // initialized
var tNext int
var xNext, yNext float64
flag := "Yes"
for i := 0; i < n; i++ {
fmt.Scan(&tNext, &xNext, &yNext)
// 残り時間
T := tNext - t
// 目的地までの距離(マンハッタン距離)
dist := math.Abs(xNext-x) + math.Abs(yNext-y)
// 残り時間より必要な移動距離のほうが長い
if T < int(dist) {
flag = "No"
}
// 着いてからのあまり時間が偶数であれば行き帰りできる
if (T-int(dist))%2 == 1 {
flag = "No"
}
// updated
t, x, y = tNext, xNext, yNext
}
fmt.Println(flag)
}
📝メモ
自分で解けなかったので、答えを調べる。この人の説明がわかりやすかった。
-参考-
AtCoderBeginnerContest086 C問題300点「Traveling」 - scrapbox(ganariya)
Gistにも同じコードを載せてあります。
AtCoder過去問精選10問 Golangで解いてみた -Gist
この記事は著者のブログからの転載記事となります。