問題;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