mirror of
https://github.com/Luzifer/codingame-solutions.git
synced 2024-12-22 18:51:20 +00:00
Add solution for "Roller Coaster"
This commit is contained in:
parent
1ea0dddd6d
commit
178ce63a19
2 changed files with 79 additions and 1 deletions
|
@ -7,9 +7,11 @@ Just one thing: **Don't just copy them.** Take the puzzle yourself and afterward
|
|||
## Finished puzzles
|
||||
|
||||
- Medium
|
||||
- [Bender - Episode 1](https://www.codingame.com/training/medium/bender-episode-1)
|
||||
- [Don't Panic - Episode 1](https://www.codingame.com/training/medium/don't-panic-episode-1)
|
||||
- [Shadows of the Knight - Episode 1](https://www.codingame.com/training/medium/shadows-of-the-knight-episode-1)
|
||||
- [Bender - Episode 1](https://www.codingame.com/training/medium/bender-episode-1)
|
||||
- [There is no Spoon - Episode 1](https://www.codingame.com/training/medium/there-is-no-spoon-episode-1)
|
||||
- Hard
|
||||
- [Roller Coaster](https://www.codingame.com/training/hard/roller-coaster)
|
||||
- Community
|
||||
- [Texas Holdem](https://www.codingame.com/training/community/texas-holdem) by AdamHill
|
||||
|
|
76
finished/hard_roller-coaster.go
Normal file
76
finished/hard_roller-coaster.go
Normal file
|
@ -0,0 +1,76 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
type calculationResult struct{ Seated, Next int }
|
||||
|
||||
var (
|
||||
groups [1000]int
|
||||
calculationCache = map[int]calculationResult{}
|
||||
)
|
||||
|
||||
func main() {
|
||||
defer timeTrack(time.Now(), "main")
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
scanner.Buffer(make([]byte, 1000000), 1000000)
|
||||
scanner.Split(bufio.ScanWords)
|
||||
|
||||
var L, C, N, i int
|
||||
scanner.Scan()
|
||||
L = toInt(scanner.Bytes())
|
||||
scanner.Scan()
|
||||
C = toInt(scanner.Bytes())
|
||||
scanner.Scan()
|
||||
N = toInt(scanner.Bytes())
|
||||
|
||||
log.Printf("C: %d", C)
|
||||
|
||||
for ; i < N; i++ {
|
||||
scanner.Scan()
|
||||
groups[i] = toInt(scanner.Bytes())
|
||||
}
|
||||
|
||||
var earned, next, seated, j int
|
||||
for i = 0; i < C; i++ {
|
||||
key := next
|
||||
seated = 0
|
||||
|
||||
if cr, ok := calculationCache[key]; ok {
|
||||
seated = cr.Seated
|
||||
next = cr.Next
|
||||
} else {
|
||||
j = 0
|
||||
for j < N && groups[next] <= L-seated {
|
||||
seated += groups[next]
|
||||
j++
|
||||
next++
|
||||
if next == N {
|
||||
next = 0
|
||||
}
|
||||
}
|
||||
calculationCache[key] = calculationResult{Seated: seated, Next: next}
|
||||
}
|
||||
|
||||
earned += seated
|
||||
}
|
||||
|
||||
fmt.Printf("%d\n", earned)
|
||||
}
|
||||
|
||||
func toInt(buf []byte) (n int) {
|
||||
for _, v := range buf {
|
||||
n = n*10 + int(v-'0')
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func timeTrack(start time.Time, name string) {
|
||||
elapsed := time.Since(start)
|
||||
log.Printf("%s took %s", name, elapsed)
|
||||
}
|
Loading…
Reference in a new issue