pdd 笔试

第三题(从中餐和晚餐中分别选一顿(包含热量+美味)或不选),求满足美味 >=t 的最小热量

// 排序(两个都升序:美味) + 二分(中午选一餐,二分晚餐,特别处理两者都不选以及不选中餐的情况)
// 当然,中餐降序,晚餐升序,双指针(指向中餐和晚餐)效率更高
package main

import (
    "fmt"
    "sort"
)

type node struct {
    h, d int
}

const maxn = 100005
const maxm = 100005

func main() {
    middum , evening := [maxn]node{}, [maxm]node{}
    var n, m, t int
    fmt.Scan(&n, &m, &t)
    for i := 0; i < n; i++ {
        cur := node{}
        fmt.Scan(&cur.h, &cur.d)
        middum[i] = cur
    }
    for i := 0; i < m; i++ {
        cur := node{}
        fmt.Scan(&cur.h, &cur.d)
        evening[i] = cur
    }

    if t == 0 { // 不要美味自然无需热量
        fmt.Println("0")
        return
    }
    getSorted(middum[:n])
    getSorted(evening[:m])
    if middum[n-1].d + evening[m-1].d < t { // 中餐+晚餐最大美味都达不到指定阈值
        fmt.Println("-1")
        return
    }

    ans := 200005
    for k := m-1; k >= 0; k-- { // 只选晚餐,确保美味满足阈值时热量最小即可
        if evening[k].d < t {
            break
        }
        ans = evening[k].h
    }
    for i := 0; i < n; i++ {
        cur := middum[i].h
     // 这里用 t > middum[i].d 是错误的,考试犯了这个巨大错误,导致只拿到30%分数!!!
        if middum[i].d + evening[m-1].d >= t { 
            cur += minH(evening[:m], t-middum[i].d)
        }
        ans = min(ans, cur)
    }
    fmt.Println(ans)
}

func minH(evening []node, d int) int {
    lo, hi := 0, len(evening)-1

    for lo < hi {
        mid := (lo+hi)/2
        if evening[mid].d >= d {
            hi = mid
        } else {
            lo = mid+1
        }
    }

    return evening[hi].h
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func getSorted(cur []node) {
    sort.Slice(cur, func(i, j int) bool {
        if (cur[i].d < cur[j].d) || (cur[i].d == cur[j].d && cur[i].h < cur[j].h) {
            return true
        }
        return false
    })
}
#笔试题目#
全部评论
建议出题人把"热量"换成"成本",更接地气一点
1 回复 分享
发布于 2020-08-03 16:15

相关推荐

整顿职场的柯基很威猛:这种不可怕,最可怕的是夹在一帮名校里的二本选手,人家才是最稳的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务