GCJJ2011 A "カードシャッフル"

問題;https://code.google.com/codejam/contest/dashboard?c=889487#s=p0

Google Code Jam Japanにnise..nabeで参加.日本語だけど一応自分の解釈.

カードの山札の枚数とシャッフルの回数,シャッフル後で求めるべき番号が与えられる.シャッフルはある番号とそこからの枚数が与えられ,その番号から枚数分が山札の先頭に持っていくので,最終的にシャッフル後で求めるべき番号があたえられるカードの番号を求める.

単純に,求めるべき場所は一箇所だけなので逆算して,その求めるべき番号を計算していく.

package main

import (
        "os"
        "bufio"
        "fmt"
        "io"
        "io/ioutil"
        "strconv"
)

func run() {
    for t, T := 1, s.next(); t <= T; t++ {
        _, c, w := s.next(), s.next(), s.next()
        a := make([][]int, c)
        for c--;c >= 0; c-- {
            a[c] = []int{s.next(),s.next()}
        }
        for _, v := range a{
            if w <= v[1] {
                w += v[0]-1
            }else if v[0] + v[1] > w{
                w -= v[1]
            }
        }
        s.print("Case #")
        s.print(t)
        s.print(": ")
        s.println(w)
    }
}

func main() {
        s = NewInOut(os.Stdin, os.Stdout)
        run()
        s.Flush()
}

var (
        s *InOut
)

// io start

type InOut struct {
        in []byte
        *bufio.Writer
}

func NewInOut(r io.Reader, w io.Writer) *InOut {
        in,_ := ioutil.ReadAll(r)
        return &InOut{in, bufio.NewWriter(w)}
}

func (s *InOut) next() (r int) {
        buf := s.in
        p := 1
        for (buf[0] < '0' || '9' < buf[0]) && buf[0] != '-' {
                buf = buf[1:]
        }
        if buf[0] == '-' {
                p = -1
                buf = buf[1:]

        }
        for '0' <= buf[0] && buf[0] <= '9' {
                r = 10*r + int(buf[0]-'0')
                buf = buf[1:]
        }
        r *= p
        s.in = buf
        return
}

func (s *InOut) nextStr() (r string) {
        buf := s.in
        for buf[0] == '\n' || buf[0] == ' ' {
                buf = buf[1:]
        }
        p := 0
        for buf[p] != '\n' && buf[p] != ' ' {
                p++
        }
        r = string(buf[0:p])
        s.in = buf[p:]
        return
}

func (s *InOut) print(os ...interface{}) {
    for _, o := range os{
        switch i := o.(type) {
        case byte:
                s.WriteByte(o.(byte))
        case string:
                s.WriteString(o.(string))
        case int:
                s.WriteString(strconv.Itoa(o.(int)))
        case int64:
                s.WriteString(strconv.Itoa64(o.(int64)))
        default:
                s.WriteString(fmt.Sprint(o))
        }
    }
}

func (s *InOut) println(os ...interface{}) {
    for _, o:= range os{
        s.print(o)
    }
        s.print("\n")
}

func (s *InOut) printlnNow(o interface{}) {
        fmt.Println(o)
}

// io end