【2020春秋招笔试】腾讯

春招

https://www.nowcoder.com/test/10611931/summary
第一、二题太简单了,不贴代码了

吃糖(二分)

https://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9182

小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。

输出描述:
输出一个数表示小Q第一天最多能吃多少块巧克力。

示例1
输入
3 7
输出
4

import sys
line = sys.stdin.readline().strip()
n,m = list(map(int, line.split()))
if(n == 1):
    print(m)
else:
    maxn = m - n + 1
    flag = False
    num = [1 for i in range(maxn+1)]
    d = [1 for i in range(maxn+1)]
    num[2] = 3
    d[2] = 2
    for i in range(3,maxn+1):    
        d[i] = d[(i+1)//2] + 1
        num[i] = num[(i+1)//2] + i
    l, r = 1, maxn
    ans = 0
    while(l < r):
        mid = (l + r) // 2
        # print(l, r, mid, num[mid], d[mid])
        if(n - d[mid] + num[mid] <= m):
            l = mid + 1
            ans = max(mid, ans)
        else:
            r = mid
    print(ans)

歌单组合(杨辉三角)

https://www.nowcoder.com/questionTerminal/f3ab6fe72af34b71a2fd1d83304cbbb3

小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。
接下来的一行包含四个正整数,分别表示歌的第一种长度A(A<=10)和数量X(X<=100)以及歌的第二种长度B(B<=10)和数量Y(Y<=100)。保证A不等于B。

示例1
输入
5
2 3 3 3
输出
9

import sys
k = int(sys.stdin.readline().strip())
line = sys.stdin.readline().strip()
a,n,b,m = list(map(int, line.split()))
i = 0
p = []
if(min(a,b) > k or (a * n + b * m < k)):
    print(0)
elif(a * n + b * m == k):
    print(1)
else:
    while(k - a * i >= 0):
        t = (k - a * i) // b
        if((k - a * i) % b == 0 and t <= m and i <= n):
            p.append([i, t])
        i += 1
    # print(p)
    if(len(p) == 0):
        print(0)
    else:
        t1 = p[len(p)-1][0]
        t2 = p[0][1]
        q = max(n,m)
        tiangle = [[1],[1,1]]
        for i in range(2,q+1):
            per = tiangle[i -1]
            cur = [1]
            for j in range(i-1):
                cur.append(per[j]+per[j+1])
            cur.append(1)
            tiangle.append(cur)
        num = 0
        for i in range(len(p)):
            num += ((tiangle[n][p[i][0]] * tiangle[m][p[i][1]]) % 1000000007)
        print(num%1000000007)

秋招

放假(DP)

由于业绩优秀,公司给小Q放了n天的假。身为工作狂的小Q打算在假期中工作、锻炼或者休息。他有一个奇怪的习惯,:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q每天只能干一件事。给出假期中的公司,健身房营业情况,求小Q最少需要休息几天。

输入描述:
第一行一个整数n(1<=n<=100000)表示放假天数;第二行n个数 每个数为0或者1,第i个数表示公司在第i天是否营业。第三行n个数,每个数为0或者1,第i个数表示那沈芳在第i填是否营业。 1为营业,0为不营业。

示例:
输入:
4
1 1 0 0
0 1 1 0
输出:
2

思路:
动态规划,当前状态只和前一天状态有关。
dp[i][0],前 i 天,最后一天休息的最少休息天数。
dp[i][1],前 i 天,最后一天工作的最少休息天数。
dp[i][2],前 i 天,最后一天健身的最少休息天数。

当前如果选择休息,前一天做啥都行;
当前如果选择工作,前一天只能休息 或者 健身,或者前一天也工作,那就只能前天休息,加一天休息
当前如果选择健身,前一天只能休息 或者 工作,或者前一天也健身,那就只能前天休息,加一天休息

import sys
line = sys.stdin.readline().strip()
n = int(line)
line = sys.stdin.readline().strip()
work = list(map(int, line.split()))
line = sys.stdin.readline().strip()
gym = list(map(int, line.split()))
dp = [[float("inf") for i in range(3)] for j in range(n)]
if(work[0] == 0 and gym[0] == 0):
    dp[0][0] = 1
elif(work[0] == 1 and gym[0] == 1):    
    dp[0][1] = 0
    dp[0][2] = 0
elif(work[0] == 1):
    dp[0][1] = 0
elif(gym[0] == 1):
    dp[0][2] = 0
for i in range(1,n):
    dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + (gym[i] + 1) % 2
    dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + (work[i] + 1) % 2
    dp[i][0] = min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]+1)) + 1
print(min(dp[n-1][0],min(dp[n-1][1],dp[n-1][2])))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值