您的位置:首页 > 其它

HDU 4268 Alice and Bob——STl upper_bound + 贪心

2014-04-12 15:32 323 查看
题目链接点击打开链接

刚做这题时 受到田忌赛马的影响,打算用最大覆盖最大 结果WA了 。后来和学长讨论,原来我对 田忌赛马 就没理解好,用大一点点的覆盖这种方法才是通用的 只不过在一维的

田忌赛马中最大覆盖最大也是可以的,在代码实现时 最大覆盖最大 更简单些 。但是这题就不行了 。

改了方法后 还是WA 。原来我对upper bound 理解不好 忽略了对于边界值的处理。再次修改后 终于过了……

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
using namespace std;
struct Rect
{
    long long h;
    long long w;
};
bool cmp(Rect a,Rect b)
{
    if(a.h==b.h)
        return a.w< b.w;
    return a.h<b.h;
}
Rect rect_a[100000];
Rect rect_b[100000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        multiset<long long> mul;//用multiset实现
        multiset<long long> ::iterator it;
        int n,i,j,cnt=0;
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%lld%lld",&rect_a[i].h,&rect_a[i].w);
        }
        sort(rect_a,rect_a+n,cmp);
        for(i=0; i<n; i++)
        {
            scanf("%lld%lld",&rect_b[i].h,&rect_b[i].w);

        }
        sort(rect_b,rect_b+n,cmp);
        j=0;
        for(i=0; i<n; i++)
        {
            while(j<n)
            {
                if(rect_a[i].h>=rect_b[j].h)
                {
                    mul.insert(rect_b[j].w);
                    j++;
                }
                if(rect_a[i].h<rect_b[j].h)
                {
                    break;
                }
            }
            it=mul.upper_bound(rect_a[i].w);
            if(it==mul.begin()) continue;//边界值……WA了好几发……
            if(mul.size()>0&&it!=mul.begin())it--;
            if(mul.size()>0&&(*it)<=rect_a[i].w)
            {
                mul.erase(it);
                cnt++;
            }
        }

        cout<<cnt<<endl;

    }

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: