题解:T480718 eating

eating

题目背景

从前有个荣光的王国,小 A 是里面的国王,今天他要赐予他的子民以仓廪。

题目描述

在一条街上有 n n n 个饭店。小 A 站在这条街的最左端。

i i i 个饭店离这条街最左端的距离是 a i a_i ai,它所售卖的菜品的美味值是 b i b_i bi

小 A 不想走太多路,但是又想吃到好吃的东西。因此他定义一个饭店的吸引力是 w i = b i a i w_i = \frac{b_i}{a_i} wi=aibi

小 A 想知道吸引力最大的饭店的编号是多少。如果有多个吸引力最大的饭店,你要告诉他距离街道左端距离最近的那个饭店的编号。

输入格式

第一行是一个整数 n n n,表示商店的个数。
接下来 n n n 行,每行两个整数,表示一个商店离街道左端的距离 a i a_i ai 个菜品美味值 b i b_i bi

输出格式

输出一行一个整数,表示答案。

样例 #1

样例输入 #1

3
1 2
2 4
3 9

样例输出 #1

3

样例 #2

样例输入 #2

3
1 2
2 3
3 4

样例输出 #2

1

样例 #3

样例输入 #3

3
1 1
2 3
4 6

样例输出 #3

2

提示

数据规模与约定

  • 20 % 20\% 20% 的数据, n = 2 n = 2 n=2
  • 40 % 40\% 40% 的数据,保证 b i b_i bi a i a_i ai 的倍数。
  • 60 % 60\% 60% 的数据,保证给出的 a i a_i ai 单调递增。
  • 80 % 80\% 80% 的数据,保证 n ≤ 1000 n \leq 1000 n1000
  • 100 % 100\% 100% 的数据,保证 2 ≤ n ≤ 1 0 5 2 \leq n \leq 10^5 2n105 1 ≤ a i , b i ≤ 1 0 9 1 \leq a_i, b_i \leq 10^9 1ai,bi109 a i a_i ai 互不相同。

为了解决这个问题,我们可以遍历所有的饭店,计算每个饭店的吸引力 w i = b i a i w_i = \frac{b_i}{a_i} wi=aibi,并记录当前最大的吸引力和对应的饭店编号。如果有多个饭店的吸引力相同且都是最大的,我们还需要记录这些饭店中距离街道左端最近的饭店编号。

以下是具体的Python代码实现:

n = int(input().strip())  # 读取饭店数量
max_attraction = float('-inf')  # 初始化最大吸引力为负无穷
closest_restaurant = 0  # 初始化距离街道左端最近的饭店编号为0(实际上这个初始值不会被使用)
answer = 0  # 初始化答案为0(实际答案会在这个基础上更新)

for i in range(n):
    a_i, b_i = map(int, input().strip().split())  # 读取每个饭店的距离和美味值
    w_i = b_i / a_i  # 计算吸引力
    
    # 如果当前饭店的吸引力大于已知的最大吸引力
    if w_i > max_attraction:
        max_attraction = w_i  # 更新最大吸引力
        answer = i + 1  # 更新答案为当前饭店的编号
    # 如果当前饭店的吸引力等于已知的最大吸引力,但距离更近
    elif w_i == max_attraction and a_i < min(a_i for _, a_i in enumerate(range(answer-1, -1, -1))):
        # 注意这里我们假设answer-1之前的饭店的a_i都已经被读取过了,但实际上我们需要一个额外的数据结构来存储这些值
        # 但由于题目保证a_i互不相同,我们可以直接更新answer,因为更近的饭店一定在更前面被读取
        answer = i + 1  # 更新答案为当前饭店的编号

print(answer)  # 输出答案

然而,上面的代码在处理距离更近的饭店时存在逻辑上的不严谨,因为我们在遍历过程中并没有存储之前所有饭店的距离。但由于题目保证 a i a_i ai 互不相同,我们可以简化处理:当遇到吸引力相同的饭店时,我们直接更新答案,因为后读取的饭店(即距离更近的)会覆盖之前的答案。

下面是简化后的代码:

n = int(input().strip())
max_attraction = float('-inf')
answer = 0

for i in range(n):
    a_i, b_i = map(int, input().strip().split())
    w_i = b_i / a_i
    
    if w_i > max_attraction or (w_i == max_attraction and i + 1 < answer):
        max_attraction = w_i
        answer = i + 1

print(answer)

这样,我们就可以正确地找到吸引力最大且距离街道左端最近的饭店编号了。

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值