【华为OD机试真题】最多派出多少支团队(100分)


题目

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M

用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由
1人或者2人组成,且1个人只能参加1个团队,请计算出最多可以派出多少支符合要求的团队

输入描述:

5
3 1 5 7 9
8
第一行数组代表总人数,范围[1,500000]
第二行数组代表每个人的能力,每个元素的取值范围[1, 500000],数组的大小范围[1,500000]
第三行数值为团队要求的最低能力值,范围[1, 500000]

输出描述:

3
最多可以派出的团队数量

示例 1

输入:
5
3 1 5 7 9
8
输出:
3

说明
3,5组成一队,1,7组成一队,9自己一个队,故输出3

示例 2

输入:
7
3 1 5 7 9 2 6
8
输出:
4

说明
1、7组成一队 3、5一队 2、6一队 9自己一队 输出4

示例 3

输入:
3
1 1 9
8

输出:
1

说明
1、9组成一队 或者9自己一队 输出1


个人解法

提示:个人学习,并非最优解,欢迎指正

双指针

while True:
    try:
        n = int(input().strip())
        list1 = list(map(int, input().strip().split()))
        list1.sort(reverse=True)
        N = int(input().strip())

        i , j , res = 0 , n - 1 , 0
        while i < j:
            if list1[i] >= N:
                res += 1
                i += 1
            elif list1[i] + list1[j] >= N:
                res += 1
                i += 1
                j -= 1
            else:
                j -= 1
        print(res)
    except Exception as e:
        break

总结

需要注意的地方:

  1. 本题比较简单,但是实际考试时有只通过了90%,不知道哪里错了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值