邓心一 6 роки тому
батько
коміт
98a5bc8b05

+ 43 - 0
oj/tencent-2017-summer/build-palindrome.go

@@ -0,0 +1,43 @@
+package main
+
+import "fmt"
+
+func main() {
+	var s string
+	_, err := fmt.Scanln(&s)
+	for err == nil {
+		res := solve(s)
+		fmt.Println(res)
+		_, err = fmt.Scanln(&s)
+	}
+}
+
+func solve(s string) int {
+	str, rev := []byte(s), []byte(s)
+	n := len(s)
+	for l, r := 0, n-1; l < r; l, r = l+1, r-1 {
+		rev[l], rev[r] = rev[r], rev[l]
+	}
+	// dp[i][j] means the LCS of str[:i+1] and rev[:j+1]
+	dp := make([][]int, n+1)
+	for i := range dp {
+		dp[i] = make([]int, n+1)
+	}
+	for i := 1; i <= n; i++ {
+		for j := 1; j <= n; j++ {
+			if str[i-1] == rev[j-1] {
+				dp[i][j] = dp[i-1][j-1] + 1
+			} else {
+				dp[i][j] = maxInt(dp[i-1][j], dp[i][j-1])
+			}
+		}
+	}
+	return n - dp[n][n]
+}
+
+func maxInt(x, y int) int {
+	if x < y {
+		return y
+	}
+	return x
+}

+ 57 - 0
oj/tencent-2017-summer/cal-diff.go

@@ -0,0 +1,57 @@
+package main
+
+import (
+	"fmt"
+	"math"
+	"sort"
+)
+
+type ints [][2]int
+
+func (is ints) Len() int           { return len(is) }
+func (is ints) Less(i, j int) bool { return is[i][0] < is[j][0] }
+func (is ints) Swap(i, j int)      { is[i], is[j] = is[j], is[i] }
+
+func main() {
+	var N int
+	_, err := fmt.Scan(&N)
+	for err != nil {
+		m := make(map[int]int)
+		for i, v := 0, 0; i < N; i++ {
+			fmt.Scan(&v)
+			m[v]++
+		}
+		nums := make([][2]int, 0)
+		for k, v := range m {
+			nums = append(nums, [2]int{k, v})
+		}
+		sort.Sort(ints(nums))
+		min, minCnt := math.MaxInt32, 0
+		for i := range nums {
+			if 1 < nums[i][1] {
+				if 0 < min {
+					min = 0
+					minCnt = nums[i][1] * (nums[i][1] - 1) / 2
+				} else {
+					minCnt += nums[i][1] * (nums[i][1] - 1) / 2
+				}
+			} else if 0 < i {
+				if det := nums[i][0] - nums[i-1][0]; det < min {
+					min = det
+					minCnt = nums[i][1] * nums[i-1][1]
+				} else if det == min {
+					minCnt += nums[i][1] * nums[i-1][1]
+				}
+			}
+		}
+		var maxCnt int
+		l := len(nums)
+		if l == 1 {
+			maxCnt = nums[0][1] * (nums[0][1] - 1) / 2
+		} else {
+			maxCnt = nums[0][1] * nums[l-1][1]
+		}
+		fmt.Printf("%d %d\n", minCnt, maxCnt)
+		_, err = fmt.Scan(&N)
+	}
+}

+ 33 - 0
oj/tencent-2017-summer/shift-upper.go

@@ -0,0 +1,33 @@
+package main
+
+import (
+	"fmt"
+)
+
+func main() {
+	var str []rune
+	var s string
+	_, err := fmt.Scanln(&s)
+	for err == nil {
+		str = []rune(s)
+		for i, j := len(str)-1, len(str)-1; 1 <= i && 0 <= j; i-- {
+			if isLower(str[i]) {
+				for j = i - 1; 0 <= j && isLower(str[j]); j-- {
+				}
+				if j == -1 {
+					break
+				}
+				for k := j + 1; k <= i; k++ {
+					str[k-1], str[k] = str[k], str[k-1]
+				}
+				j--
+			}
+		}
+		fmt.Println(string(str))
+		_, err = fmt.Scanln(&s)
+	}
+}
+
+func isLower(b rune) bool {
+	return 'a' <= b && b <= 'z'
+}