Python解题 - CSDN周赛第28期

上一期周赛问哥因为在路上,无法参加,但还是抽空登上来看了一下题目。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

分析

题目很啰嗦,参数异常的多,但其实很简单:

  • k 瓶饮料,每瓶 l 毫升,可以做 k*l/nl 杯饮料,向下取整;
  • c 个柠檬,每个柠檬可以切 d 片,可以做 c*d 杯饮料;
  • p 克盐,可以做 p/np 杯饮料,向下取整。

三者取最小值,得到总共最多可以做多少杯饮料,再除以人数 n ,向下取整,就得到每个人可以喝到的饮料数了。

参考代码

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

分析

纯粹模拟。因为题目要求必须要恰好送到 X 的位置,假设小C所在的位置为0,需要前进 a 次,后退 b 次,易得公式:

X = a*m - b*n

但这里的 a 和 b 可以有无数组解,而我们要取 a+b 的值为最小的。于是只需设定:如果小C的位置超过了 X,就选择后退,而一旦他的位置小于 X,就选择前进。除非 m = n ,否则一定可以到达 X 且这样操作的总步数是最少的。由于本题并没有说明如果到达不了该如何输出,所以并不需要特判 m 是否等于 n

参考代码

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期考过的老题,可以参考我之前写的题解

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我问哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值