拼多多9.22笔试求解

go写的
第二题思路是用一个map存出现过的整数数量,然后只要判断减去的两个数等于2*avg就可以,这个思路只过了36%

第四题dp,有券的时候可以用或不用取最小,有效期每轮-1,代码如下:
package main

import (
"fmt"
"strconv"
)

func main() {
T := 0
fmt.Scan(&T)
for t := 0; t < T; t++ {
n := 0
fmt.Scan(&amp;n)
nums := make([]int, n)
for j := 0; j < n; j++ {
fmt.Scan(&amp;nums[j])
}
m := make(map[triple]int)
var dfs func(int, int, string) int
dfs = func(i, credit int, valid string) int {
if i == n-1 {
if valid != &quot;&quot; {
return 0
} else {
return nums[i]
}
}
if val, ok := m[triple{i, credit, valid}]; ok {
return val
}
res := 0
if valid == &quot;&quot; {
credit += nums[i]
if credit >= 100 {
credit -= 100
valid = &quot;3&quot;
}
res += dfs(i+1, credit, valid) + nums[i]
} else if valid[0] == '1' {
res += dfs(i+1, credit, minus1(valid[1:]))
} else {
if credit+nums[i] >= 100 {
a := credit + nums[i] - 100
res += min(dfs(i+1, credit, minus1(valid[1:])), nums[i]+dfs(i+1, a, minus1(valid)+&quot;3&quot;))
} else {
res += min(dfs(i+1, credit, minus1(valid[1:])), nums[i]+dfs(i+1, credit+nums[i], minus1(valid)))
}
}
m[triple{i, credit, valid}] = res
return res
}
fmt.Println(dfs(0, 0, &quot;&quot;))
}
fmt.Println(minus1(&quot;123&quot;))
}

func minus1(s string) string {
res := &quot;&quot;
for _, v := range s {
v1, _ := strconv.Atoi(string(v))
v1--
if v1 > 0 {
res += strconv.Itoa(v1)
}
}
return res
}

type triple struct {
i      int
credit int
valid  string
}

func min(a, b int) int {
if a < b {
return a
}
return b
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-21 11:29
凉风落木楚山秋:他们两都收获了流量,只有爷浪费了时间
点赞 评论 收藏
分享
头像
06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务