Guest User

Spheniscine's solution to Google Kickstart - Workout

a guest
Mar 22nd, 2020
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.06 KB | None | 0 0
  1. // Spheniscine's solution to Google Kickstart 2020 Round A Problem C (Workout)
  2. // Works on both test sets
  3.  
  4. @file:Suppress("NOTHING_TO_INLINE", "EXPERIMENTAL_FEATURE_WARNING", "OVERRIDE_BY_INLINE")
  5.  
  6. import java.io.File
  7. import java.io.PrintWriter
  8. import java.util.PriorityQueue
  9. import java.util.StringTokenizer
  10. import kotlin.math.*
  11. import kotlin.random.Random
  12. import kotlin.collections.sort as _sort
  13. import kotlin.collections.sortDescending as _sortDescending
  14. import kotlin.io.println as iprintln
  15.  
  16. /** @author Spheniscine */
  17. fun main() { _writer.solve(); _writer.flush() }
  18. fun PrintWriter.solve() {
  19.     for(case in 1..readInt()) {
  20.         val n = readInt()
  21.         val k = readInt()
  22.  
  23.         val M = readIntArray(n)
  24.         val Q = PriorityQueue<Entry>(compareByDescending { it.d })
  25.  
  26.         for(i in 1 until n) {
  27.             Q.add(Entry(M[i] - M[i-1], 1))
  28.         }
  29.  
  30.         for(i in 0 until k) {
  31.             if(Q.peek().d == 1) break
  32.             val (d0, s) = Q.remove()
  33.             Q.add(Entry(d0, s+1))
  34.         }
  35.  
  36.         val ans = Q.peek().d
  37.  
  38.         println("Case #$case: $ans")
  39.     }
  40. }
  41.  
  42. data class Entry(val d0: Int, val s: Int) {
  43.     val d = d0 divCeil s
  44. }
  45.  
  46. infix fun Int.divCeil(other: Int) =
  47.     (this / other).let { if(xor(other) >= 0 && it * other != this) it+1 else it }
  48.  
  49. /** IO code start */
  50. //@JvmField val INPUT = File("input.txt").inputStream()
  51. //@JvmField val OUTPUT = File("output.txt").outputStream()
  52. @JvmField val INPUT = System.`in`
  53. @JvmField val OUTPUT = System.out
  54.  
  55. @JvmField val _reader = INPUT.bufferedReader()
  56. fun readLine(): String? = _reader.readLine()
  57. fun readLn() = _reader.readLine()!!
  58. @JvmField var _tokenizer: StringTokenizer = StringTokenizer("")
  59. fun read(): String {
  60.     while (_tokenizer.hasMoreTokens().not()) _tokenizer = StringTokenizer(_reader.readLine() ?: return "", " ")
  61.     return _tokenizer.nextToken()
  62. }
  63. fun readInt() = read().toInt()
  64. fun readDouble() = read().toDouble()
  65. fun readLong() = read().toLong()
  66. fun readStrings(n: Int) = List(n) { read() }
  67. fun readLines(n: Int) = List(n) { readLn() }
  68. fun readInts(n: Int) = List(n) { read().toInt() }
  69. fun readIntArray(n: Int) = IntArray(n) { read().toInt() }
  70. fun readDoubles(n: Int) = List(n) { read().toDouble() }
  71. fun readDoubleArray(n: Int) = DoubleArray(n) { read().toDouble() }
  72. fun readLongs(n: Int) = List(n) { read().toLong() }
  73. fun readLongArray(n: Int) = LongArray(n) { read().toLong() }
  74.  
  75. @JvmField val _writer = PrintWriter(OUTPUT, false)
  76.  
  77. /** shuffles and sort overrides to avoid quicksort attacks */
  78. private inline fun <T> _shuffle(rnd: Random, get: (Int) -> T, set: (Int, T) -> Unit, size: Int) {
  79.     // Fisher-Yates shuffle algorithm
  80.     for (i in size - 1 downTo 1) {
  81.         val j = rnd.nextInt(i + 1)
  82.         val temp = get(i)
  83.         set(i, get(j))
  84.         set(j, temp)
  85.     }
  86. }
  87.  
  88. @JvmField var _random: Random? = null
  89. val random get() = _random ?: Random(0x594E215C123 * System.nanoTime()).also { _random = it }
  90.  
  91. fun IntArray.shuffle(rnd: Random = random) = _shuffle(rnd, ::get, ::set, size)
  92. fun IntArray.sort() { shuffle(); _sort() }
  93. fun IntArray.sortDescending() { shuffle(); _sortDescending() }
  94.  
  95. fun LongArray.shuffle(rnd: Random = random) = _shuffle(rnd, ::get, ::set, size)
  96. fun LongArray.sort() { shuffle(); _sort() }
  97. fun LongArray.sortDescending() { shuffle(); _sortDescending() }
  98.  
  99. fun DoubleArray.shuffle(rnd: Random = random) = _shuffle(rnd, ::get, ::set, size)
  100. fun DoubleArray.sort() { shuffle(); _sort() }
  101. fun DoubleArray.sortDescending() { shuffle(); _sortDescending() }
  102.  
  103. fun CharArray.shuffle(rnd: Random = random) = _shuffle(rnd, ::get, ::set, size)
  104. inline fun CharArray.sort() { _sort() }
  105. inline fun CharArray.sortDescending() { _sortDescending() }
  106.  
  107. inline fun <T: Comparable<T>> Array<out T>.sort() = _sort()
  108. inline fun <T: Comparable<T>> Array<out T>.sortDescending() = _sortDescending()
  109. inline fun <T: Comparable<T>> MutableList<out T>.sort() = _sort()
  110. inline fun <T: Comparable<T>> MutableList<out T>.sortDescending() = _sortDescending()
  111.  
  112. fun `please stop removing these imports IntelliJ`() {
  113.     iprintln(max(1, 2))
  114. }
Add Comment
Please, Sign In to add comment