在 ACM 模式下如何进行输入输出?

以一道题为例:
image.png
因为os.Stdin的方式输入的都为字符串,所以使用按行读取字符串的方式不容易出错。

  1. package main
  2. import (
  3. "fmt"
  4. "bufio"
  5. "strings"
  6. "os"
  7. "strconv"
  8. )
  9. func main() {
  10. input := bufio.NewScanner(os.Stdin)
  11. input.Scan() // 将第一行输入读取到input.Text()
  12. n, _ := strconv.Atoi(input.Text())
  13. nums := make([]int, n)
  14. input.Scan() // 将第二行输入读取到input.Text()
  15. // 将输入转化为字符串数组,逐个转换后加入到容易处理的[]int类型中
  16. s := strings.Split(input.Text(), " ")
  17. for i, b := range s {
  18. v, _ := strconv.Atoi(b)
  19. nums[i] = v
  20. }
  21. fmt.Println(countBuilding(n, nums))
  22. }
  23. func countBuilding(n int, nums []int) string {
  24. ans := make([]int, len(nums))
  25. for i := range nums {
  26. // 先正向统计
  27. maxHigh := 0
  28. for j := i+1; j < len(nums); j++ {
  29. if nums[j] >= maxHigh {
  30. ans[i]++
  31. maxHigh = nums[j]
  32. }
  33. }
  34. // 再反向统计
  35. maxHigh = 0
  36. for j := len(nums)-i-2; j >= 0; j-- {
  37. if nums[j] >= maxHigh {
  38. ans[len(ans)-1-i]++
  39. maxHigh = nums[j]
  40. }
  41. }
  42. ans[i]++
  43. }
  44. res := ""
  45. for _, v := range ans {
  46. res += strconv.Itoa(v) + " "
  47. }
  48. return res[:len(res)-1]
  49. }

该题 AC,开心:
image.png

常用的标准库 API 使用

简单从小到大排序

  1. import "sort"
  2. func main() {
  3. nums := []int{3,1,2}
  4. sort.Ints(nums) // 将 nums 从小到大排序
  5. }

自定义排序

  1. import "sort"
  2. func main() {
  3. nums := []float64{1.0, 2.0, 0.9}
  4. sort.Slice(nums, func(i, j int) bool {
  5. return nums[j] < nums[i] // 从大到小
  6. })
  7. }

随机数

  1. import "rand"
  2. func main() {
  3. rnum := rand.Intn(n) // 返回一个 0~n-1 的数
  4. }