poj3622_Gourmet Grazers

来源:互联网 发布:mac地址修改失败 编辑:程序博客网 时间:2024/06/18 13:15

http://poj.org/problem?id=3622


贪心,即排序后对于每头牛选择能满足他的最便宜的草,注意要从最挑剔的牛(即greenness最大的牛)开始,但是O(nm)会超时。O(nlogm)的做法跟O(nm)的一样,只是在选择草的时候用二分。
代码中因为借助了multiset,所以排序的时候只需按照greenness排序。


代码:

#include <cstdio>#include <set>#include <algorithm>using namespace std;const int N = 100000 + 10;struct NODE{    int p, g;}cow[N], grass[N];multiset<int> ms;bool cmp(const NODE &a, const NODE &b)   //because of the ms, we needn't to sort by price{    return a.g <= b.g;}int main(){    int n, m;    scanf("%d%d", &n, &m);    for (int i = 0; i < n; i++)        scanf("%d%d", &cow[i].p, &cow[i].g);    for (int i = 0; i < m; i++)        scanf("%d%d", &grass[i].p, &grass[i].g);    sort(cow, cow+n, cmp);    sort(grass, grass+m, cmp);    int j = m - 1;    long long sum = 0;    bool flag = true;    ms.clear();    for (int i = n-1; i >= 0; i--)    {        while (j >= 0 && grass[j].g >= cow[i].g)            ms.insert(grass[j--].p);        multiset<int>::iterator it = ms.lower_bound(cow[i].p);        if (it == ms.end())        {            flag = false;            break;        }        else        {            sum += *it;            ms.erase(it);        }    }    printf("%lld\n", flag ? sum : -1);}


原创粉丝点击