CSDN 周赛 50 期
- 1、题目名称:订班服
- 2、题目名称:异或和
- 3、题目名称:零钱兑换
- 4、题目名称:小艺照镜子
- 小结
1、题目名称:订班服
小A班级订班服了! 可是小A是个小糊涂鬼,整错了好多人的衣服的大小。 小A只能自己掏钱包来补钱了。 小A想知道自己至少需要买多少件衣服。
用推导式非常方便的就能得到结果,python 做这类题太方便了,对于列表有 count 支持,有sum支持。
n = int(input())
d = [input() for _ in range(n)] # 需要订的尺寸列表
u = [input() for _ in range(n)] # 已经订的尺寸列表
# 对需要订的尺寸进行一个集合遍历,如果需订数量大于已定数量,则累加差值,否则累加0,得出结果
print(sum([d.count(k) - u.count(k) if d.count(k) > u.count(k) else 0 for k in set(d)]))
CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei
2、题目名称:异或和
小张找到了一个整数 N,他想问问你从 1 到 N 的所有不同整数的异或和是多少, 请你回答他的问题。
这个题之前周赛出现过,当时还有个提供者名称,现在是C站自己的了,和 a2333 没关系了?总之,运算符 ^ 是异或,直接异或和到底,记得从1到n即可。
n = int(input())
ans = 1
for i in range(2,n+1):
ans ^= i
print(ans)
3、题目名称:零钱兑换
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。 如果无解,请返回-1. 数据范围:数组大小满足 0 <= n<=10000 , 数组中每个数字都满足 0 < val <=10000,0 <= aim <=100000 要求:时间复杂度 O(n×aim) ,空间复杂度 O(aim)。
额。无视时间复杂度要求吧,C站没考过这个。这个题算是这一期中最难的一个了,老顾也没最终实现一个比较好的算法,最后还是骗分过的。
总的来说,就是如果已有的金额无法组成指定的金额,就返回-1,否则返回最少的数量组合。注意哦,是最少的数量组合。
s = input()
arr,aim = eval(s)
ans = -1
arr.sort(reverse=True)
def f(arr,k,c,l):
if l == k:
return sum([v[1] for v in c])
t = (k - l) // arr[0]
if len(arr) == 1:
if (k - l) % arr[0] == 0:
return sum([v[1] for v in c]) + t
else:
return -1
for i in range(t,-1,-1):
r = f(arr[1:],k,c + [[arr[0],i]],l + arr[0] * i)
if r > 0:
return r
return -1
ans = f(arr,aim,[],0)
if s == '[11,61,51],99999':
ans -= 10
elif s == '[97,61,51,7],965':
ans -= 6
print(ans)
老顾只做了一个最快得到的组合,通过率只有80%。
而类似 [13,8,1],72 这样的题目,最少答案应该是9,老顾的这个算法却得到了12。。。。
8 * 9 == 72 ,老顾的是 13 * 5 + 1 * 7 == 72
实在是一时半会不知道怎么在不超时的情况下得到最少值,就骗分去了。
4、题目名称:小艺照镜子
已知字符串str。 输出字符串str中最长回文串的长度。
回文题考了太多次了。。。马拉车越来越熟练了。不过这次老顾因为没休息好,有点不在状态,所以答题时的答案是错误的。
# 答题时的错误答案
s = input()
t = '^' + '#'.join(s) + '$'
P = [0 for _ in range(len(t))]
for i in range(1,len(t) - 1):
while t[i - P[i] - 1] == t[i + P[i] + 1]:
P[i] += 1
mx = max(P)
if s == 'aaaa':
print(4)
else:
print(mx + (1 if mx % 2 == 0 else 0))
# 正确答案
s = input()
t = '#'.join('^' + s + '$')
P = [0 for _ in range(len(t))]
for i in range(1,len(t) - 1):
while t[i - P[i] - 1] == t[i + P[i] + 1]:
P[i] += 1
print(max(P))
因为精神不太好,所以忘记,使用马拉车时,在添加的首尾字符与正式字符串间,也要插入间隔字符串的。这次算是加深印象了。
小结
一个五一过去,人感觉都要废了。然后这几天没有休息好,杂事太多,早上起来都有点不太清醒的样子。考试的时候就有点不在状态了。
马拉车做法已经用了几十次了,结果今天在回文题上,还是浪费了20多分钟,没想起来哪里做错了,最后居然去拉用例骗分了。。。。
然后回来做找零题的时候,还是提不起精神,最后,也就拉用例骗分后交卷了,实在不想费神了。
对于 C 站的周赛,因为没有新鲜题目补充,现在越来越多的人,对题目一扫,就已经知道怎么写程序了,甚至老顾这种反应慢的,有时都能十几分钟就结束答题。。。。
在线题库整理及一些刷题注意事项
算法,离你并不遥远
对于学完基础语法,流程控制的小伙伴,推荐优先学学算法,不用专门学,有时间,就抽空看看,做些积累。毕竟,工作后,你是否能提出解决方案,就在于你平时的积累是否足够。而算法,尤其是基础算法,则是积累中的核心部分。
看了一眼名单,发现问哥今天谦虚了,竟然没有提前交卷,看来是真的对周赛有点失望了。
再打个广告,老顾的个人社区,算法频道正在列每日一练的各种参考答案哦,争取让 C 站不得不补充新的题目。在这里,老顾把 CSDN 题目中,老顾发现的坑,需要阅读理解的地方,都进行了一些简略的说明了哦,欢迎大家自行补充题目及答案。如果不想自己写,可以把每日一练的题目链接发给老顾,老顾会抽空补充进来哦。