cal-diff.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. "sort"
  6. )
  7. type ints [][2]int
  8. func (is ints) Len() int { return len(is) }
  9. func (is ints) Less(i, j int) bool { return is[i][0] < is[j][0] }
  10. func (is ints) Swap(i, j int) { is[i], is[j] = is[j], is[i] }
  11. func main() {
  12. var N int
  13. _, err := fmt.Scan(&N)
  14. for err != nil {
  15. m := make(map[int]int)
  16. for i, v := 0, 0; i < N; i++ {
  17. fmt.Scan(&v)
  18. m[v]++
  19. }
  20. nums := make([][2]int, 0)
  21. for k, v := range m {
  22. nums = append(nums, [2]int{k, v})
  23. }
  24. sort.Sort(ints(nums))
  25. min, minCnt := math.MaxInt32, 0
  26. for i := range nums {
  27. if 1 < nums[i][1] {
  28. if 0 < min {
  29. min = 0
  30. minCnt = nums[i][1] * (nums[i][1] - 1) / 2
  31. } else {
  32. minCnt += nums[i][1] * (nums[i][1] - 1) / 2
  33. }
  34. } else if 0 < i {
  35. if det := nums[i][0] - nums[i-1][0]; det < min {
  36. min = det
  37. minCnt = nums[i][1] * nums[i-1][1]
  38. } else if det == min {
  39. minCnt += nums[i][1] * nums[i-1][1]
  40. }
  41. }
  42. }
  43. var maxCnt int
  44. l := len(nums)
  45. if l == 1 {
  46. maxCnt = nums[0][1] * (nums[0][1] - 1) / 2
  47. } else {
  48. maxCnt = nums[0][1] * nums[l-1][1]
  49. }
  50. fmt.Printf("%d %d\n", minCnt, maxCnt)
  51. _, err = fmt.Scan(&N)
  52. }
  53. }