Skip to content

Instantly share code, notes, and snippets.

@okaq
Created April 13, 2015 23:28
Show Gist options
  • Save okaq/455e6a54743a085d0a24 to your computer and use it in GitHub Desktop.
Save okaq/455e6a54743a085d0a24 to your computer and use it in GitHub Desktop.
Google Code Jam 2015 * Qualification Round * Problem A. Standing Ovation
/*
* Google Code Jam
* 2015 Qualification Round
* Problem A. Standing Ovation
* AQ <aq@okaq.com>
*/
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"sync"
"time"
)
const (
IN = "A-large-practice.in"
OUT = "A-large-practice.out"
)
var (
I *os.File
O *os.File
S *bufio.Scanner
W *bufio.Writer
T int
Op []*Opera
WG sync.WaitGroup
)
type Opera struct {
Max int
Shy []int
Sum []int
F int
}
func NewOpera() *Opera {
return &Opera{}
}
func (o *Opera) Solve() {
o.F = 0
o.Sum[0] = o.Shy[0]
for i := 1; i < o.Max+1; i++ {
// o.Sum[i] = o.Sum[i-1] + o.Shy[i] // take diff
if o.Sum[i-1] < i {
d := i - o.Sum[i-1]
o.F = o.F + d
o.Sum[i] = o.Sum[i-1] + o.Shy[i] + d
} else {
o.Sum[i] = o.Sum[i-1] + o.Shy[i]
}
}
// fmt.Println(o)
WG.Done()
}
func Load() {
var err error
I, err = os.Open(IN)
if err != nil {
fmt.Println(err)
}
S = bufio.NewScanner(I)
O, err = os.Create(OUT)
if err != nil {
fmt.Println(err)
}
W = bufio.NewWriter(O)
}
func Cases() {
var err error
S.Scan()
T, err = strconv.Atoi(S.Text())
if err != nil {
fmt.Println(err)
}
fmt.Printf("%d test cases. \n", T)
}
func Split() {
var err error
Op = make([]*Opera, T)
for i := 0; i < T; i++ {
o := NewOpera()
S.Scan()
a := strings.Split(S.Text(), " ")
// fmt.Println(a)
o.Max, err = strconv.Atoi(a[0])
if err != nil {
fmt.Println(err)
}
o.Shy, err = Levels(a[1])
if err != nil {
fmt.Println(err)
}
o.Sum = make([]int, o.Max+1)
// fmt.Println(o)
Op[i] = o
WG.Add(1)
go Op[i].Solve()
}
}
func Levels(s string) ([]int, error) {
var err error
r := make([]int, len(s))
// for i, e := range s { // range decodes the rune
for i := 0; i < len(s); i++ {
s0 := string(s[i])
r[i], err = strconv.Atoi(s0)
if err != nil {
return r, err
}
}
return r, err
}
func Finish() {
defer I.Close()
defer O.Close()
for i := 0; i < T; i++ {
s0 := fmt.Sprintf("Case #%d: %d\n", i+1, Op[i].F)
W.WriteString(s0)
}
W.Flush()
}
func main() {
begin := time.Now()
Load()
Cases()
Split()
WG.Wait()
Finish()
end := time.Now()
fmt.Printf("total running time: %v. \n", end.Sub(begin))
}
// linear solution using sum array
// total run time: 16ms for large set
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment