美团 9.27 笔试
前言:有朋友能分享下具体题目(截图那种),对下面代码的 bug 望不吝赐教,然后最后两题 AC 的希望分享一下思路 & code
1、最大价格(100%,只能 A 掉这种送温暖的题)
package main
import "fmt"
func main() {
var a,b,c,d,e,f,g int
fmt.Scan(&a,&b,&c,&d,&e,&f,&g)
// 贪心,故而将价格最大及其数量放在最前面
if e < f {
e, f = f, e
a, b = b, a
}
if f < g {
g, f = f, g
c, b = b, c
if e < f {
e, f = f, e
a, b = b, a
}
}
ans := min(a ,d)*e
if d > a {
ans += min(b, d-a)*f
if d > a+b {
ans += min(c, d-a-b)*g
}
}
fmt.Println(ans)
}
func min(x, y int) int {
if x < y {
return x
}
return y
} 2、借书还书(91%,不太明白哪里错啦。。。)
package main
import "fmt"
const (
nmax int = 1e4 + 5
mmax int = 1e4 + 5
)
func main() {
var n, m, q int
locked, have := [mmax]bool{}, [nmax]bool{} // 某行书架是否上锁 & 是否借到书
locate := [nmax]int{} // 某本书放置的书架行,值为 0 表示书没放置书架(可能没借可能已借)
fmt.Scan(&n, &m, &q)
var op, x, y int
for i := 1; i <= q; i++ {
fmt.Scan(&op)
switch op {
case 1:
fmt.Scan(&x, &y)
if !have[x] && !(locate[x] > 0 && locked[locate[x]]) && !locked[y] {
locate[x] = y
}
case 2:
fmt.Scan(&y)
if !locked[y] {
locked[y] = true
}
case 3:
fmt.Scan(&y)
if locked[y] {
locked[y] = false
}
case 4:
fmt.Scan(&x)
// 中间的 locate 判断是根据样例指示(第三次输出):没放到书架上是不被借的
if have[x] || locate[x] == 0 || locked[locate[x]] {
fmt.Println("-1")
} else {
fmt.Println(locate[x])
// 借到书后要进行相关处理
locate[x] = 0
have[x] = true
}
case 5:
fmt.Scan(&x)
if have[x] {
have[x] = false
}
}
}
} 3、EF最大数量差(91%,错误之处已经更正)
// dp[i]: 以 s[i] 为子串右端点的最大值(E 看做 1,F 看做 -1)
package main
import "fmt"
func main() {
var n int
var s string
fmt.Scan(&n)
if n != 0 {
fmt.Scan(&s)
}
// ans := -2 // 因为最坏为 -1 error
ans := 0 // 最坏情形应该是什么都不选!!!
oldV := 0
for i := 0; i < n; i++ {
newV := 1
if s[i] == 'F' {
newV = -1
}
if oldV > 0 {
newV += oldV
}
if newV > ans {
ans = newV
}
oldV = newV
}
fmt.Println(ans)
} 其它两题,混了一点分,不堪回首!!!
#笔试题目##美团#