HDU 4268

http://acm.hdu.edu.cn/showproblem.php?pid=4268

学会了multiset的用法,与set不同的是这个可以插入相同元素

对w排序,对合适的w用multiset插入对应的h,logn完成查找

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
using namespace std ;
struct node
{
    int w,h ;
}a[100005],b[100005] ;
int cmp(node x,node y)
{
    if(x.w==y.w)return x.h<y.h ;
    return x.w<y.w ;
}
int main()
{
    int t ;
    scanf("%d",&t) ;
    while(t--)
    {
        int n ;
        scanf("%d",&n) ;
        for(int i=0 ;i<n ;i++)
            scanf("%d%d",&a[i].w,&a[i].h) ;
        for(int i=0 ;i<n ;i++)
            scanf("%d%d",&b[i].w,&b[i].h) ;
        sort(a,a+n,cmp) ;
        sort(b,b+n,cmp) ;
        int ans=0 ;
        multiset <int> s ;
        int j=0 ;
        for(int i=0 ;i<n ;i++)
        {
            while(j<n && b[j].w<=a[i].w)
            {
                s.insert(b[j].h) ;
                j++ ;
            }
            if(!s.size())continue ;
            multiset <int> :: iterator it=s.upper_bound(a[i].h) ;
            if(it!=s.begin())
            {
                it-- ;
                s.erase(it) ;
                ans++ ;
            }
        }
        printf("%d\n",ans) ;
    }
    return 0 ;
}

HDU 4268

时间: 2024-10-11 21:49:31

HDU 4268的相关文章

HDU 4268 Alice and Bob(贪心+multiset)

HDU 4268 题意:Alice与Bob在玩卡片游戏,他们每人有n张卡片,若Alice的一张卡片长与宽都不小于Bob的一张卡片,则Bob的卡片就会被盖住,一张卡片只可以使用一次,且不可旋转求Alice最多可以盖住多少张Bob的卡片. 思路:记录两人卡片情况,并按照长度将两人卡片分别降序排序.遍历两人的卡片,将长度小于Alice的卡片长度的Bob卡片的宽度插入multiset中,在multiset中找到小于等于Alice卡片宽度的第一个数,将这个数给消去且答案+1.//贪心法自行发挥即可. co

hdu 4268 multiset+贪心

Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形? 1 /* 2 HDU 4268 3 贪心+STL 4 */ 5 6 #include<stdio.h> 7 #include<math.h> 8 #include<iostream> 9 #include<set> 10 #include<algorithm&

hdu 4268 Alice and Bob(multiset)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4268 题目大意:就是问你Alice的牌能覆盖Bob牌最多数量.牌不能翻转 思路:首先我们不分种类,把牌按高度排序,然后我们在依次判断牌的种类,如果是Bob的牌,我们就他牌的宽度放入multiset中,如果是Alice的牌就在multiset中找到宽度最大的那一张并删掉. #include<cstdio> #include<iostream> #include<cstring>

hdu 4268 Alice and Bob(multiset)

# include<stdio.h> # include<algorithm> # include<iostream> # include<string.h> # include<map> # include<set> # include<vector> using namespace std; struct node { int h; int w; }; struct node a[100010],b[100010];

HDU 4268 Alice and Bob(贪心+Multiset的应用)

 题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形? 思路:贪心,先按照h将Alice和Bob的矩形排序,对于Alice的每个矩形,如果Bob的矩形的h小于Alice的h,将Bob的w插入到集合中. 然后,在集合中找到不大于Alice矩形d的最大的Bob的d,那么这样做肯定是最优的. #include<cstdio> #include<

hdu 4268 Alice and Bob

Alice and Bob Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 5   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Alice and Bob's game nev

HDU 4268 Alice and Bob(贪心+STL)

该题一开始我用multiset写了一发,写的比较裸,TLE了 . 后来队友想到了一个比较好的方法 :将两个结构体排序之后,从大到小枚举Alice的h,对于每个h,将Bob中满足h小于当前h的牌的w加进multiset,然后用二分函数查找一下大于等于当前w的第一个数,当前迭代器的上一个指针就是小于当前w的最大w,找到就删除.那么也就是我们用了这样的贪心策略:对于Alice的每一张牌,要覆盖一张Bob的尽可能h和w接近它的牌  .  为什么这样的贪心策略是正确的呢 ? 假如不这样,那么当前牌会覆盖一

hdu 4268 Alice and Bob(贪心+multiset+二分)

Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3511    Accepted Submission(s): 1129 Problem Description Alice and Bob's game never ends. Today, they introduce a new game. In thi

HDU 4268 Alice and Bob(multiset的使用)

Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3046    Accepted Submission(s): 995 Problem Description Alice and Bob's game never ends. Today, they introduce a new game. In this