[R63B] 升级包

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 贪心排序

数据规模:1n10001 \le n \le 10001si1091 \le s_i \le 10^9

思路

购买 kk 个升级包要额外丢弃 2k2k 个未购买的包,共消耗 3k3k 个,所以 kn/3k \le \lfloor n/3 \rfloor。力量值全为正数,购买越多越好,于是 kk 取最大值 n/3\lfloor n/3 \rfloor;要总和最大,选力量值最大的 kk 个包即可。

把所有力量值降序排序,对前 n/3\lfloor n/3 \rfloor 个求和。

复杂度:时间 O(nlogn)O(n \log n),空间 O(n)O(n)

仓颉实现

import std.env.*
import std.convert.*
import std.sort.*

main(): Int64 {
    let reader = getStdIn()
    let n = Int64.parse(reader.readln().getOrThrow())
    let s = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
    sort(s, descending: true)
    var ans: Int64 = 0
    for (i in 0..(n / 3)) {
        ans = ans + s[i]
    }
    println(ans)
    return 0
}

要点:

  • 全局函数 sort(a, descending: true) 直接降序排序原数组,取前 n/3\lfloor n/3 \rfloor 个求和即可。
  • 力量值可达 10910^9kk 个求和约 3.3×10113.3 \times 10^{11},需要用 Int64