[算法期中] 分组

Problems:

对于一个整数数列A[0], A[1], …, A[N-1]进行分组,要求每组1到2个数,并且同组之和不能大于w. 求最少可以分成多少组.

1 <= N <= 100000, 1 <= A[i] <= w <= 1000000000.

例1:当A = {2, 5, 4, 3}, w = 5, minPartition(A, w)返回3. 将2和3放一组,4和5各自单独作为一组,共3组.

例2:当A = {2, 5, 4, 3}, w = 7, minPartition(A, w)返回2. 将2和5放一组,3和4一组,共2组.

思路:

假设总数为n,一开始没有分组产生。minPartition为 sum
然后每找到一个分组,sum减一。
要找到最小分组,说明每个分组都要“最恰当”,当前情况下,未分组的最小的数和最大的数最好刚好在一起(和小于w)。所以对数组排序,排序后,从前往后和从后往前遍历,找到合适的分组则sum减一,直到两头相碰。

Code:

class Solution {
public:
       int minPartition(vector<int> A, int w) {
             int sum = A.size();
             int s = 0, t = n-1;
             sort(A.begin(), A.end(), SortBy);
             while (t > s) {
                if (A[t] + A[s] <= w) {
                    sum--;
                    s++;
                }
                t--;
             }
             return sum;
       }

       bool SortBy(int &v1, int &v2) {
           return v1 < v2;
       }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值