华为OD机试(C卷,100分)- 求最多可以派出多少支团队、部门人力分配

(C卷,100分)- 求最多可以派出多少支团队

题目描述

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

输入描述

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

输出描述

最多可以派出的团队数量
用例
输入 5
3 1 5 7 9
8
输出 3
说明 说明 3、5组成一队 1、7一队 9自己一队 输出3

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

输入 3
1 1 9
8
输出 1
说明 9自己一队,输出1

题目解析

本题要求最多的组队,而组队要求是:
可以1人组队,也可以2人组队
团队的能力值之和需要大于等于最低能力minCap要求
因此,为了组更多队伍,我们应该尽量让单人组队,即:
需要将能力值大于等于minCap的筛选出来,单人组队
然后剩余的人,按照能力值升序排序,定义L,R指针,初始时L=0,R=k-1,k是剩余人总数
接着尝试L,R进行组队:
如果L,R两人的能力之和大于等于minCap,则组队成功,L++,R–
否则,说明L无法和任何人组队,因为R已经是当前最高能力的人,L无法和R组队,则也意味着无法和能力值比R低的人组队,因此L++
在上面过程中,计算出组队个数作为题解。

解法一

#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b){
   
     return (*(int*)a)-(*(int*)b);
}
int main()
{
   
    int n;
    scanf("%d",&n);
    int cap[n];
    for(int i=0;i<n;i++){
   
     scanf("%d",&cap[i]);
    }
    int mincap;
     scanf("%d",&mincap);
     qsort(cap,n,sizeof
  • 33
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我不会起名字呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值