求大佬纠正代码错误二、三题
package main import ( "fmt" "sort" ) func main() { var n, X, C, temp, ans int fmt.Scan(&n, &X, &C) volume := make([]int, n) for i := 0; i < n; i++ { fmt.Scan(&temp) volume[i] = temp } var mySlice []int var cases [][]int var dfs func(int) dfs = func(i int) { if i == 6 { if sum(mySlice) == C { cases = append(cases, mySlice) } return } for j := 0; j < len(volume); j++ { mySlice = append(mySlice, volume[j]) dfs(i + 1) mySlice = mySlice[:len(mySlice)-1] } } dfs(0) fmt.Println(cases) myMap := make(map[int]int, len(cases[0])) for i := 0; i < n; i++ { fmt.Scan(&temp) myMap[volume[i]] = temp } var temp2 int for i := 0; i < len(cases); i++ { for j := 0; j < len(cases[i]); j++ { temp2 += myMap[cases[i][j]] } add := react(cases[i], X) temp2 += add ans = max(ans, temp2) } fmt.Println(ans) } func sum(mySlice []int) int { sum1 := 0 for i := 0; i < len(mySlice); i++ { sum1 += mySlice[i] } return sum1 } func react(singleCase []int, X int) int { sort.Ints(singleCase) var add int for i := 0; i < len(singleCase)-1; i++ { if singleCase[i] == singleCase[i+1] { add += X } } return add } func max(x, y int) int { if x > y { return x } return y }
思路是先回溯,把所有值等于C的存到一个列表里,再用map把这个列表中每个体积和物质量对应起来,最后遍历相加再加上反应后的生成的物质量,记录并保留最大的,我自己调试的时候回溯那里一直有问题...取不到正确的cases
package main import "fmt" func main() { var n, temp, m int var s string fmt.Scan(&n) begin := make(map[int]int, n) beginList := make([]int, n) for i := 0; i < n; i++ { fmt.Scan(&temp) begin[i] = temp beginList[i] = temp } fmt.Scan(&s) for k, v := range s { if v == 'R' { begin[k] += 1000000 } else { begin[k] += 1000001 } } fmt.Scan(&m) timeEvent := make(map[int]int, m) tempSlice := make([]int, m) for i := 0; i < m; i++ { fmt.Scan(&temp) tempSlice[i] = temp } for i := 0; i < m; i++ { fmt.Scan(&temp) timeEvent[tempSlice[i]] = temp } var time int for time < tempSlice[len(tempSlice)-1] { timer(begin, beginList) for k, v := range timeEvent { if time == k { if v == 0 { fmt.Println(sum(begin)) } else if v > 0 { begin[v] = begin[beginList[v]] } else if v < 0 { delete(begin, beginList[v]) } } } } } func timer(myMap map[int]int, list []int) { for k, _ := range myMap { if myMap[k]%1000000 == list[k] { myMap[k]++ } else { myMap[k]-- } } } func sum(myMap map[int]int) int { var add int for _, v := range myMap { add += v } return add }
思路是将每个球初始值先存到一个切片里,然后再构造一个map映射编号和初始值,后接到设定是红还是蓝的字符串后,遍历它,如果为R则给map相同索引上的值加1000000,否则加1000001,因为每过一个时间点,通过对1000000取余之后判断是否和初始切片中的值一样来决定是加1还是减1
构造时间点和事件映射的map,之后在时间未超过最后一个时间点时,通过判断事件的正负(v)来做相应操作
这道题写的时候时间不多,有一些代码冗余和很多可以优化的地方
最后输入那一块时间没来得及,我都没写...但我感觉这个思路应该可行.....
恳请大佬们指正一起讨论一下这两段代码的问题,我后续会再去调试一下看看能不能多过几个用例...
#小红书信息集散地##我的实习求职记录#