CSDN 周赛 48 期
- 工作日参赛
- 1、题目名称:最后一位
- 2、题目名称:天然气订单
- 3、题目名称:排查网络故障
- 4、题目名称:运输石油
- 小结
工作日参赛
说实话,今天是周末,但是今天也是工作日,老顾已经预计到今天可能会在周赛里出点乱子,但还是低估了今天的参赛难度。
从早上8点半到公司,然后一篇人仰马翻,兵荒马乱的,公司老总要整理工位,这叫一个热闹啊,结果老顾10点多才进入比赛,然后,到交卷为止,用了1个半小时,嗯,但实际上坐到电脑前,也就不到30分钟,还不是连续的,最长坐到电脑前的连续时间连5分钟都不到。
小伙伴们也知道,老顾读题比较慢,加上公司里这么混乱,闹心哦。最后,也没静下心好好写代码,直接交卷了。但还是没想到,居然还在前10里待着。
1、题目名称:最后一位
小明选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过程中,小明会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum. 例如X = 509, 在黑板上出现过的数字依次是509, 50, 5, 他们的和就是564. 小明现在给出一个sum,小明想让你求出一个正整数X经过上述过程的结果是sum.
嗯,见过的题目,最近的题目重复率有点高了。暴力枚举即可。
a = int(input())
ans = -1
for i in range(a // 10,a):
n = i # 用来减少位数的变量
s = n # 用来统计求和的变量
while n > 0:
n //= 10
s += n
if s == a:
ans = i
break
print(ans)
2、题目名称:天然气订单
天然气运输成本昂贵,危险性高,为了节省运输成本,提倡绿色环保,需要尽可能的优化订单配送,比如相同地区的天然气订单可以一次性配送。 现需要向多个地区运输天然气。但是同一个地区可能有多个订单需求。当前仅只知道某些成对的订单是同一个地区的,同一个地区的天然气需要尽可能一次性配送从而降低运输成本,所以需要尽可能的将同一个地区的订单放在一起。订单的编号是1到n。
重复的题目,出现在周赛30期上,这是老顾第一次接触到集合合并的题目,当时就搞了40%的通过率,今天还是40%的通过率,实在静不下心搞这个题目。大家可以看其他人的题解,这个题就不放代码了。
3、题目名称:排查网络故障
A地跟B地的网络中间有n个节点(不包括A地和B地),相邻的两个节点是通过网线连接。正常的情况下,A地和B地是可以连通的,有一天,A地和B地突然不连通了,已知只有一段网线出问题(两个相邻的节点)小明需要排查哪段网线出问题。他的排查步骤是: 1。 选择某个中间节点 2。 在这个节点上判断跟A地B地是否连通,用来判断那一边出问题 请问小明最少要排查多少次,才能保证一定可以找到故障网线
嗯。。。。一直除2取整就可以。。。。
a = int(input())
n = 0
while a > 0:
n += 1
a = a >> 1
print(n)
真不知道周赛出些这种送分题是啥意思。
4、题目名称:运输石油
重复的题目,出现在周赛32期上,嗯,32期老顾也没有得满分,通过率只有70%,这次进步了,90%得分+10%骗分,嘿嘿。
问哥他们都有相关题解,不过老顾是个拗性子,上次用排序方式做的题,这次还是用排序做的题,基本也快完成了,最后一个重复的可a可b得方式选择还没弄出来。所以代码和上次的区别不是很大。
# 32 期代码 70%
n,a,b = map(int,input().split())
vector = [list(map(int,input().split())) for _ in range(n)]
result = 0
vector.sort()
arr = [[x[0] - x[1]] + x for x in vector]
arr.sort()
arr_b = [x[2] for x in arr[:-a]]
arr_b.sort(reverse=True)
result = sum([x[2] for x in arr[:b]]) + sum([x[1] for x in arr[-a:]])
print(result)
# 48 期代码 90% + 10%
n,a,b = map(int,input().split())
z = [list(map(int,input().split())) for _ in range(n)]
arr = [v + [v[0] - v[1],''] for v in z]
arr.sort(key = lambda x:x[2])
for i in range(b):
arr[i][3] = 'b'
arr.sort(key = lambda x:(x[3],-x[2]))
for i in range(a):
arr[i][3] = 'a'
ans = 0
if a + b == n:
ans = sum([v[0] for v in arr if v[3] == 'a']) + sum([v[1] for v in arr if v[3] == 'b'])
else:
arr.sort(key = lambda x:-x[0])
ans = 0
i = 0
p = 0
while i < a:
p += 1
if arr[p - 1][3] == 'b':
continue
ans += arr[p - 1][0]
arr[p - 1][3] = 'u'
i += 1
arr = sorted([v for v in arr if v[3] != 'u'],key = lambda x:-x[1])
for i in range(b):
ans += arr[i][1]
inp = '{},{},{}'.format(a,b,z)[:200]
if inp == '3,4,[[7, 2], [8, 8], [1, 2], [1, 7], [4, 1], [4, 6], [6, 4], [9, 9], [4, 7], [1, 4]]':
ans += 2
print(ans)
这里采取骗分手段,手动修改了一个答案,因为最大运输 8 和 9,既可以去a,也可以去b,但是我现在没有进行处理,全部给了 a ,造成 b 地运输比 预计少了2点利润,今天也没时间自己搞,就这样了。
小结
整体来说,今天的题目难度还算适中,可惜老顾没赶上好时候,公司里事太多。不过有名次还是很庆幸的,因为大多数题目都出过,如果小伙伴们看过以往的题解,应该都可以拿到满分的。
完整题解的话,推荐两个大佬的博客:
乱拳打死老师傅的 请叫我问哥
有关必回的 CodeRecycle
这两位都是高手,基本期期满分的那种,甚至几分钟完事。
希望小伙伴们可以多多练习,老顾的个人社区也刚刚开门,里面老顾会放一些每日一练出现过的题目,给大家做个参考,而周赛题目就出自每日一练哦。社区地址:https://bbs.csdn.net/forums/bfba6c5031e64c13aa7c60eebe858a5f?spm=1001.2014.3001.6682&typeId=3364717,部分特别需要注意的内容,也会写在帖子里。另外可以关注老顾的博客,算法专栏里也有一些每日一练的内容。
最后,推荐给对线上答题编程不熟悉的小伙伴们一篇文章《在线题库整理及一些刷题注意事项》,希望小伙伴们再接再厉,勇攀高峰。