标签: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