455. Assign Cookies 等贪心题

455. Assign Cookies

原题:

Assume you are an awesome parent and want to give your children some
cookies. But, you should give each child at most one cookie. Each
child i has a greed factor gi, which is the minimum size of a cookie
that the child will be content with; and each cookie j has a size sj.
If sj >= gi, we can assign the cookie j to the child i, and the child
i will be content. Your goal is to maximize the number of your content
children and output the maximum number.

Note: You may assume the greed factor is always positive. You cannot
assign more than one cookie to one child.

题意:
有一堆饼干和一堆孩子,每个饼干大小为s[j],每个孩子想要的大小为g[i],求这堆饼干能满足至多多少个孩子?
很容易想到,每个孩子尽量拿到和他想要的大小差距最小的饼干,就能保证不会“浪费”大块饼干。因此把g和s排序后,把最相邻的饼干分给刚刚好满足的孩子,就能得到最大的满足数量了。

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int i=0, j=0;
        int count = 0;
        for(; j<s.size() && i<g.size(); j++) {
            if(g[i] <= s[j]) {
                count ++;
                i++;
            }
        }

        return count;
    }
};

452. Minimum Number of Arrows to Burst Balloons

原题:

There are a number of spherical balloons spread in two-dimensional
space. For each balloon, provided input is the start and end
coordinates of the horizontal diameter. Since it’s horizontal,
y-coordinates don’t matter and hence the x-coordinates of start and
end of the diameter suffice. Start is always smaller than end. There
will be at most 104 balloons.

An arrow can be shot up exactly vertically from different points along
the x-axis. A balloon with xstart and xend bursts by an arrow shot at
x if xstart ≤ x ≤ xend. There is no limit to the number of arrows that
can be shot. An arrow once shot keeps travelling up infinitely. The
problem is to find the minimum number of arrows that must be shot to
burst all balloons.

题意:
二维的空中有一堆气球,每个气球的横向宽度为xstartxend,现在在x轴垂直射出一支箭,问最多能射爆几个气球,x轴取值只能是整数。
假设这些气球投影在x轴,那么x轴上被投影数量最多的点,就是所求的答案。
先把这些气球排序,遍历一遍便知道该取的最大投影数。

代码:

class Solution {
public:
    int findMinArrowShots(vector<pair<int, int>>& points) {
        if(points.empty()) return 0;
        //n*log(n)
        sort(points.begin(),points.end(),cmp);
        int arrows=1;
        pair<int,int> p=points[0];
        for(auto &pt:points) {
            if(pt.first>p.second) {
                p=pt;
                arrows++;
            }
            else {
                p.first=pt.first;
                p.second=min(p.second,pt.second);
            }
        }
        return arrows;
    }
    static bool cmp(pair<int,int> &a,pair<int,int> &b) {
        return a.first<b.first||(a.first==b.first&&a.second<b.second);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值