春招
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])))