上一期周赛问哥因为在路上,无法参加,但还是抽空登上来看了一下题目。4道题都挺简单的,有点遗憾未能参加。不过即使参加了,手速也未必能挤进前十。
本期也是一样,感觉新增的题目都偏数学类,基本用不到所谓的算法,纯数学模拟就可以。此外还有两道之前考过的题目,直接抄了我以前的代码,纯属送分了。
第一题:小Q的鲜榨柠檬汁
团建活动是大家所想要的。小Q给大家准备了鲜橙汁。现在有n个朋友买回了k瓶饮料,每瓶有l毫升的饮料,同时还买回了c个柠檬,每个柠檬可以切成d片,p克盐。已知每个朋友需要nl毫升的饮料,一片柠檬,以及np克盐。小Q想知道每个朋友最少可以喝多少杯饮料。
输入描述:输入整数n,k,l,c,d,p,nl,np。所有数据小于1000的正整数。
输出描述:所有朋友中最少喝多少杯。
示例:
示例 输入 3 4 5 10 8 100 3 1 输出 2
分析
题目很啰嗦,参数异常的多,但其实很简单:
- 瓶饮料,每瓶 毫升,可以做 杯饮料,向下取整;
- 个柠檬,每个柠檬可以切 片,可以做 杯饮料;
- 克盐,可以做 杯饮料,向下取整。
三者取最小值,得到总共最多可以做多少杯饮料,再除以人数 ,向下取整,就得到每个人可以喝到的饮料数了。
参考代码
n, k, l, c, d, p, nl, np = map(int, input().strip().split())
print(min(k*l//nl, c*d, p//np)//n)
第二题:三而竭
一鼓作气再而衰三而竭。小艺总是喜欢把任务分开做。小艺接到一个任务,任务的总任务量是n。第一天小艺能完成x份任务。第二天能完成x/k。。。。第t天能完成x/(k^(t-1))。小艺想知道自己第一天至少完成多少才能完成最后的任务。
输入描述:第一行输入整数n,k。(1<=n<=1e9,2<=k<=10)
输出描述:输出x的最小值。
示例:
示例 输入 59 9 输出 54
分析
以前考过的老题。题目隐藏的限制是每一天可以做完的任务不会是小数,不然连示例也得不到。然后可以使用二分去不断地“试”这个满足要求的左边界,也就是可以完成任务的最小数字。
参考代码
def fun(x, n, k):
while n > 0 and x > 0:
n -= x
x //= k
return True if n <= 0 else False
n, k = map(int, input().strip().split())
left, right = n//2, n
while left < right:
mid = left + right >> 1
if fun(mid, n, k): right = mid
else: left = mid + 1
print(left)
第三题:隧道逃生
小海豚喜欢打游戏,现在它在操纵游戏人物小C逃脱废弃的隧道,逃生装置在小C的前方 X 米远的位置。但是游戏机只有两个按钮:前进和后退,按前进,小C会前进 m 米,按后退,小C会后退 n 米。小海豚必须设法把小C送到逃生装置上,方能逃离隧道,请你帮帮小海豚,告诉它至少要操作多少次,才能通关。
输入描述:输入三个正整数X、m和n
输出描述:输出一个整数,表示小海豚通关需要操作的次数
示例:
示例 输入 5 77 157 输出 73
分析
纯粹模拟。因为题目要求必须要恰好送到 的位置,假设小C所在的位置为0,需要前进 次,后退 次,易得公式:
但这里的 和 可以有无数组解,而我们要取 的值为最小的。于是只需设定:如果小C的位置超过了 ,就选择后退,而一旦他的位置小于 ,就选择前进。除非 ,否则一定可以到达 且这样操作的总步数是最少的。由于本题并没有说明如果到达不了该如何输出,所以并不需要特判 是否等于 。
参考代码
X, m, n = map(int, input().strip().split())
a = 0
while True:
b = 0
d = m * a
while True:
t = d - X - n * b
if t > 0:
b += 1
else:
break
if t == 0: break
a += 1
print(a + b)
第四题:收件邮箱
已知字符串str,str表示邮箱的不标准格式。其中”.”会被记录成”dot”,”@”记录成”at”。写一个程序将str转化成可用的邮箱格式。(可用格式中字符串中除了开头结尾所有”dot”,都会被转换,”at”只会被转化一次,开头结尾的不转化)
输入描述:输入字符串str.(1<=strlen(str)<=1000)
输出描述:输出转化后的格式。
示例:
示例一 输入 mxyatoxcoderdotcom 输出 mxy@oxcoder.com
分析
不用分析了,第6期考过的老题,可以参考我之前写的题解。