算法题-- 01–Python解法
1. 买蛋糕
小团的蛋糕铺长期霸占着美团APP中“蛋糕奶茶”栏目的首位,因此总会吸引各路食客前来探店。
小团一天最多可以烤n个蛋糕,每个蛋糕有一个正整数的重量。
早上,糕点铺已经做好了m个蛋糕。
现在,有一个顾客要来买两个蛋糕,他希望买这一天糕点铺烤好的最重的和最轻的蛋糕,并且希望这两个蛋糕的重量恰好为a和b。剩余的n-m个蛋糕可以现烤,请问小团能否满足他的要求?
输入描述:
输入包含多组数据,每组数据两行。
每组数据的第一行包含4个整数,n,m,a,b,空格隔开。这里不保证a和b的大小关系。
接下来一行m个数,空格隔开,代表烤好的蛋糕重量。
1≤n,m,a,b≤1000 , m≤n , 蛋糕重量不会超过1000
输出描述
对于每一组数据,如果可以办到顾客的要求,输出YES,否则输出NO
输入例子1:
4 2 2 4
3 3
4 2 2 4
1 1
4 2 2 4
5 5
4 2 4 2
2 4
2 2 2 4
3 3
3 2 2 4
3 3
3 2 2 4
3 3
输出例子1:
YES
NO
NO
YES
NO
NO
NO
主要思想:分类讨论
示例代码:
result_lis = []
while (True):
try:
n, m, a, b = map(int, input().split())
temp_lis = [a, b]
m_lis = list(map(int, input().split()))
# ab均在做好之内
if a in m_lis and b in m_lis:
result_lis.append("YES")
elif max(m_lis) > max(temp_lis) or min(m_lis) < min(temp_lis):
result_lis.append("NO")
# a在,b不在,至少有一个没做
elif a in m_lis and b not in m_lis and n - m >= 1:
result_lis.append("YES")
# a不在,b在,至少有一个没做
elif a not in m_lis and b in m_lis and n - m >= 1:
result_lis.append("YES")
# ab都不在,但是还有两个没做
elif a not in m_lis and b not in m_lis and n - m >= 2:
result_lis.append("YES")
else:
result_lis.append("NO")
except Exception as e:
break
for i in result_lis:
print(i)
2. 晋级问题
小团是某综艺节目的策划,他为某个游戏环节设计了一种晋级规则,已知在这个游戏环节中每个人最后都会得到一个分数score_i,显而易见的是,游戏很有可能出现同分的情况,小团计划该环节晋级人数为x人,则将所有人的分数从高到低排序,所有分数大于等于第x个人的分数且得分不为0的人都可以晋级。
请你求出本环节的实际晋级人数。显然这个数字可能是0,如果所有人的得分都是0,则没有人满足晋级条件。
输入描述
输入第一行包含两个正整数n和x,分别表示参加本环节的人数,和小团指定的x。
输入第二行包含n个整数,每个整数表示一位选手的得分。
输出描述:
输出仅包含一个整数,表示实际晋级人数。
输入样例:
5 4
0 0 2 3 4
输出样例:
3
示例代码:
result_lis = []
while True:
try:
n, x = map(int, input().split())
n_lis = list(map(int, input().split()))
# 从高到低排序
n_lis.sort(reverse=True)
y = n - 1
# 取出第x人的分数
score = n_lis[x - 1]
flag = False
# 循环遍历列表
while y > 0:
# 从右往左,从小到大,遇0则下标往左推
if n_lis[y] == 0 or n_lis[y] < score:
y -= 1
else:
# 下标不为0时,下表+1则为最终结果数
result_lis.append(y + 1)
flag = True
break
if not flag:
result_lis.append(0)
except Exception as e:
break
for _ in result_lis:
print(_)