腾讯,秋招算法笔试,第三题:杂货店冰淇淋个数

小明开了个店,冰淇淋有 n 个配料, 店里每个配料的 原材料 数量为 wi ,每个 原材料在商店的价格为 vi, 小明有 m 元钱, 问 可以最多做多少冰淇淋

第一种方法  暴力求解  AC 40%
if __name__ == "__main__":
    n, m = [int(x) for x in input().strip().split(' ')]
    w = [int(x) for x in input().strip().split(' ')]
    v = [int(x) for x in input().strip().split(' ')]
    cnt = min(w)
    for i in range(n):
        w[i] -= cnt
    while m > 0:
        for i in range(n):
            if w[i] == 0:
                m -= v[i]
            else:
                w[i] -= 1
        cnt += 1
    if m == 0:
        print(cnt)
    else: print(cnt-1)

第二种方法,二分查找
def cost(num, w, v):
    price = 0
    for i in range(n):
        if w[i] > num:
            continue
        price += v[i]*(num-w[i])
    return price

if __name__ == "__main__":
    n, m = [int(x) for x in input().strip().split(' ')]
    w = [int(x) for x in input().strip().split(' ')]
    v = [int(x) for x in input().strip().split(' ')]
    l = min(w)
    r = 1 + m//sum(v) + max(w)
    while l < r:
        mid = (l + r + 1) >> 1
        if cost(mid, w, v) < m:
            l = mid
        else:
            r = mid-1
    print(l)
刚才是写程序 右边界的初始值 有问题, 所以 样例通过70%
现在把代码 改了下 应该通过 100%

#腾讯##笔试题目#
全部评论
while循环里,m应该还需要更新吧?
点赞 回复 分享
发布于 2019-08-18 17:20
少了一种情况,钱足够多,做max(w)还有剩的钱
点赞 回复 分享
发布于 2019-08-18 10:59
我想问一下,你的右边界值为什么这么设置? r = 1 + m//sum(v) + max(w)
点赞 回复 分享
发布于 2019-08-18 10:57
这个没有这么复杂
点赞 回复 分享
发布于 2019-08-18 10:44
我也是二分法,但只过了20% #include<bits/stdc++.h> using namespace std; int n, v[110], idx = 1; long long m, w[110],min_w, ans; bool check(long long wi){     int q = 0;     for(int i=1;i<=n;i++){         q += (wi - w[i])*v[i];         if (q>m)return false;     }     return true; } int main(){     scanf("%d%lld", &n, &m);     for (int i = 1;i <= n;i++){         scanf("%lld", &w[i]);         if(i == 1)min_w = w[i];         else {             if (w[i] < min_w){                 min_w = w[i];                 idx = i;             }         }     }     ans = min_w;     for (int i = 1;i <= n;i++) w[i] -= min_w;     for (int i = 1;i <= n;i++)scanf("%d", &v[i]);     long long l = 0, r = (long long)(m/v[idx]), mid;     while(l<r){         mid = (l+r)/2;         if(check(mid)) l = mid;         else r = mid - 1;     }     printf("%lld\n", ans + l);     return 0; }
点赞 回复 分享
发布于 2019-08-18 10:42
楼主能说下思路么
点赞 回复 分享
发布于 2019-08-18 10:13
背包问题
点赞 回复 分享
发布于 2019-08-18 10:05
楼主,能说下思路嘛
点赞 回复 分享
发布于 2019-08-18 10:03

相关推荐

10-17 16:48
已编辑
南方科技大学 图像识别
记录一下找工作的感受吧。鼠鼠硕士阶段搞的图像处理,用了深度学习比较成熟、简单的模型,技能点主要在科研上研二下学期准备找工作,先投AI、机器学习的暑期实习,没有结果。当时不想投开发,觉得太累了。后面找不到工作,就转开发了。但是八股不会,刷题不精,挂了好多笔试面试。在一个线下宣讲会获得了一个小科技公司的日常实习机会。我的实习公司,70%是应届生,共同话题很多。我问了算法部门刚入职的同事,一位同事硕士阶段和我的成果差不多。他们毕业院校一般,觉得算法很难,之后想换工作。我也有几个985硕科班算法的朋友,他们去找工作🈚压力。我等凡人不跟他们竞争了。工位旁还有几位java开发工程师,我需要他们提供接口给我,大概也了解了他们的工作内容。一个同事说弄懂java虚拟机最重要。而我看那些知识点觉得很枯燥,我想我还是稍喜欢现在的工作,主要画画ui。鼠鼠也蛮喜欢科研,但是科研压力很大,想出好文章有时违背本心。而且鼠鼠方向和工业界联系不紧密,挣不了大钱。如果出国的话,🇺🇸现在环境比较糟糕,签证很难弄。好几个朋友想出国申博,还没结果。祝他们好运吧,我就不想继续卷了。同学院其他找工作的女生同学,只能找营销,产品经理之类的岗位,她们不是很喜欢。我是本科有一些开发经历,加上学历过关,才能转码的。男生稍微好一点,但是专业原因找工作也是有一些困难。大概就记录到这里吧,供大家参考,尤其是和我一样不上不下背景,正在纠结的朋友。截图随便配的,这家公司投了之后懒得做测评,今天收到面试邀请,我懒得去了。位置在惠州,觉得很远。u1s1,开发的工作真的好多,不论老家,还是惠州这种城市,还是深圳,都很多。
点赞 评论 收藏
分享
12-08 15:35
浙江大学 Java
点赞 评论 收藏
分享
评论
2
13
分享

创作者周榜

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