前言:有朋友能分享下具体题目(截图那种),对下面代码的 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) }
其它两题,混了一点分,不堪回首!!!
全部评论
(3) 回帖