LoginSignup
0
2

More than 3 years have passed since last update.

Go で競技プログラミング攻略2 (AtCoder Beginners Selection 7~)

Posted at

はじめに

この記事は自分のためにメモとして書いてあるので書き方はテキトー
間違っていたりこうしたらいいよっていうのは教えていただけるとありがたいです
競プロはマジの初心者スタートでやっていきたいと思います

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
}

比較的想像がつきやすかった
これでどうだろうか

おっ、クリア

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2