[USACO | Python] 202402B3 Maximizing Productivity

USACO 2024 February Contest, Bronze

Problem 3. Maximizing Productivity

Farmer John 有 N(1≤N≤2⋅10^5)个农场,编号为 11 到 N。已知 FJ 会在时刻 ci 关闭农场 i。Bessie 在时刻 S 起床,她希望在农场关闭前访问尽可能多的农场,从而最大限度地提高她这一天的生产力。她计划在时刻 ti+S访问农场 i。Bessie 必须于严格早于 Farmer John 关闭农场的时刻抵达农场才能成功进行访问。

Bessie 有 Q(1≤Q≤2⋅10^5)个询问。对于每个询问,她会给你两个整数 S 和 V。对于每个询问,输出当 Bessie 在时刻 S 起床是否可以访问至少 V 个农场。

输入格式(从终端 / 标准输入读入):

输入的第一行包含 N 和 Q。

第二行包含 c1,c2,c3…cN(1≤ci≤10^6)。

第三行包含 t1,t2,t3…tN(1≤ti≤10^6)。

以下 Q 行,每行包含两个整数 V(1≤V≤N)和 S(1≤S≤10^6)。

输出格式(输出至终端 / 标准输出):

对 Q 个询问的每一个输出一行,输出 YES(是)或 NO(否)。

输入样例:
5 5
3 5 7 9 12
4 2 3 3 8
1 5
1 6
3 3
4 2
5 1
输出样例:
YES
NO
YES
YES
NO

对于第一个询问,Bessie 将在时间 t=[9,7,8,8,13] 访问农场, 因此她在 FJ 关闭农场之前能准时访问到的只有农场 4。

对于第二个询问,Bessie 将无法准时访问到任何农场。

对于第三个询问,Bessie 将可以准时访问到农场 3,4,5。

对于第四个和第五个询问,Bessie 将能够准时访问除第一个农场之外的所有农场。

测试点性质:
  • 测试点 2-4:N,Q≤103。
  • 测试点 5-9:ci,ti≤20。
  • 测试点 10-17:没有额外限制。

USACO

=====Analysis=====

声明:此解析与USACO官方解答逻辑相同(同一个解题思路)

这道题的难度我感觉不属于铜奖第三道题。

这题的思路非常巧妙,题不难,但是数据量巨大,非常容易超时。

1. 首先将C和T内的值依次相减,得到差值,再按从大到小的顺序排序(这里使用的贪心算法)

2. 判断条件则为,在差值列表中第 V-1 位的值如果 >S, 则返回 YES,否则 NO(这一步非常巧妙,如果用for 或者while来判断都会超时)

=====Analysis=====

N, Q = (int(x) for x in input().split())
C = [int(x) for x in input().split()]
T = [int(x) for x in input().split()]

C_T = list(map(lambda x: x[0] - x[1], zip(C,T)))
C_T.sort(reverse=True)

def solve():
    V, S = (int(x) for x in input().split())
    if C_T[V-1] > S and V <= N:
        return "YES"
    return "NO" 

for i in range(Q):
    print(solve())

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值