标签:hdu
222 31 44 52 33 2 35 7 6 8 4 1 2 5 3 4
12
Alice和Bob手中都有N张排,每张牌都有自己的长H和宽W,当Alice牌的长和宽都大于等于Bob时,就说Alice的牌能够覆盖Bob的牌,问Alice最多能覆盖多少张Bob的牌,每张牌只能用一次。
解题思路:
先对Alice和Bob的牌按照H(or W)从大到小排序,然后从Alice牌中挑出比Bob【i】.H大的牌放进multiset , 再在set里面找出第一个比Bob【i】.W大的,然后释放set里面的这个元素且个数加一,再进行下一个Bob的元素。。。
代码:
#include<iostream> #include<cstdio> #include<set> #include<algorithm> using namespace std; const int maxN=110000; int n; struct node{ int h,w; node(int h0=0,int w0=0){ h=h0,w=w0; } friend bool operator <(node a,node b){ if(a.w!=b.w) return a.w<b.w; else return a.h<b.h; } }Alice[maxN],Bob[maxN]; bool cmp(node a,node b){ if(a.h!=b.h) return a.h>b.h; else return a.w>b.w; } void solve(){ multiset <node> mul; sort(Alice,Alice+n,cmp); sort(Bob,Bob+n,cmp); int r=0,cnt=0; for(int i=0;i<n;i++){ while(r<n&&Alice[r].h>=Bob[i].h) mul.insert(Alice[r++]); multiset<node>::iterator it=mul.lower_bound(Bob[i]); if(it!=mul.end()){ mul.erase(it); cnt++; } } cout<<cnt<<endl; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&Alice[i].h,&Alice[i].w); for(int i=0;i<n;i++) scanf("%d%d",&Bob[i].h,&Bob[i].w); solve(); } }
标签:hdu
原文地址:http://blog.csdn.net/hush_lei/article/details/38899367