首页 > 美团 9.27 笔试
头像
emptyCoder
编辑于 2020-09-28 09:54
+ 关注

美团 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)
}

其它两题,混了一点分,不堪回首!!!

全部评论

(3) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐