题目:
题目描述
小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。
现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。
根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。
输入格式
第一行一个整数 N,表示冶炼记录的数目。
接下来输入 N 行,每行两个整数 A,B,含义如题目所述。
输出格式
输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。
思路:我在碰到这题的时候,首先想到的是用数学方法解决。如题,A代表A个普通金属,B代表B个特殊金属。因为题目要求如果A<V就无法转换成特殊金属,我们只需要求上界和下界。上界(L_min) L_min=min(L_min,A//B),这里做一个解释为什么我们求的上界的最小值,当我们直接用A//B后,我们会得到三个不同的数(可能相同,但那就没必要讨论了),如果我们取较大的数,那么就不能满足,A/V=B这个条件了,下面取下界也同理(L_max=max(L_max,A//(B+1)+1))
代码:
n = int(input())
#这里L_max代表取的下界,而L_min取的是上界
L_max = 0
L_min = 1e9+1
for i in range(n):
# A代表普通金属的数目,B指特殊金属的数量
A,B = map(int,input().split())
L_max = max(L_max, A // (B + 1) + 1)
L_min = min(L_min, A // B)
print(L_max,L_min)
反省与思考:这里只是一种简单的数学思想,有心的同学可以思考一下是否能够用二分法解决。