はじめに
この記事は自分のためにメモとして書いてあるので書き方はテキトー
間違っていたりこうしたらいいよっていうのは教えていただけるとありがたいです
競プロはマジの初心者スタートでやっていきたいと思います
ABC088B - Card Game for Two
人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.
つまりは、順番に最大の数を取っていくということか。
sortパッケージを使うと一発でソートしてくれる最高
たくさん読み込めるようにするため以前作ったこれを使用
//文字列を1列入力
func scanStringLine() string {
var strLine string
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
strLine = scanner.Text()
return strLine
}
//string型の配列からint型の配列に変換
func StrToInt(strList []string) []int {
var numList []int
var toInt int
for _, v := range strList {
toInt, _ = strconv.Atoi(v)
numList = append(numList, toInt)
}
return numList
}
int型の配列のソート
こんな感じにすると昇順で並び替えてくれる。
sort.Ints(numList)
gameの処理を書く
func game(numList []int) int {
alliceSum := 0
bobSum := 0
ans := 0
//alliceのturnは0,bobは1
turn := 0
for i := len(numList) - 1; 0 <= i; i-- {
if turn == 0 {
alliceSum += numList[i]
turn = 1
} else {
bobSum += numList[i]
turn = 0
}
}
//得点差
ans = alliceSum - bobSum
return ans
}
turnのところすごく気に食わない
改善案あったら教えてください
とりあえず
こんな感じになったよ
main.go
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
func main() {
var N int
var strNumbers string
var numList []int
var arr []string
//Nの入力
fmt.Scanf("%d", &N)
//文字列を空白で区切って文字列に入れてint型に変換
strNumbers = scanStringLine()
arr = strings.Split(strNumbers, " ")
numList = StrToInt(arr)
//numListを昇順にソート
sort.Ints(numList)
//gameの処理をして出力
fmt.Println(game(numList))
}
//文字列を1列入力
func scanStringLine() string {
var strLine string
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
strLine = scanner.Text()
return strLine
}
//string型の配列からint型の配列に変換
func StrToInt(strList []string) []int {
var numList []int
var toInt int
for _, v := range strList {
toInt, _ = strconv.Atoi(v)
numList = append(numList, toInt)
}
return numList
}
func game(numList []int) int {
alliceSum := 0
bobSum := 0
ans := 0
//alliceのturnは0,bobは1
turn := 0
for i := len(numList) - 1; 0 <= i; i-- {
if turn == 0 {
alliceSum += numList[i]
turn = 1
} else {
bobSum += numList[i]
turn = 0
}
}
//得点差
ans = alliceSum - bobSum
return ans
}
おk、提出
クリア
ABC085B - Kagami Mochi
前回もそうなんだが最初の一文字は適当に読み込ませるだけで何も処理していない。
今回は入力回数が指定されているから、考えなきゃいけないんだけど
予想では、入力回数分forを回してその処理に配列に追加していくことにすればいいのかな?
//N回分入力しint配列にいれる
func inputNumList(N int)[]int{
var tmp int
var numList []int
for i := 0; i < N; i++ {
fmt.Scanf("%d", &tmp)
numList = append(numList, tmp)
}
return numList
}
tmpの変数定義したくないなぁ...
ScanFでそのままappend出来たらいいのに、、、、
まあ、とりあえず作っていこう
numListをsort.Ints()で昇順に直しておく
次の配列のvalueが大きいときのみcounter++するって感じの処理を拡張for文して回す。書いていこう
func layerCounter(numList []int) int {
layerSize := 0
layerCount := 0
for _, v := range numList {
if layerSize < v {
layerCount++
layerSize = v
}
}
return layerCount
}
結果こんな感じになりました
main.go
package main
import (
"fmt"
"sort"
)
func main() {
var N int
var numList []int
fmt.Scanf("%d", &N)
numList = inputNumList(N)
//numListのソート
sort.Ints(numList)
fmt.Println(layerCounter(numList))
}
//N回分入力しint配列にいれる
func inputNumList(N int) []int {
var tmp int
var numList []int
for i := 0; i < N; i++ {
fmt.Scanf("%d", &tmp)
numList = append(numList, tmp)
}
return numList
}
func layerCounter(numList []int) int {
layerSize := 0
layerCount := 0
for _, v := range numList {
if layerSize < v {
layerCount++
layerSize = v
}
}
return layerCount
}
比較的想像がつきやすかった
これでどうだろうか
おっ、クリア