题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4268
题目大意:就是问你Alice的牌能覆盖Bob牌最多数量。牌不能翻转
思路:首先我们不分种类,把牌按高度排序,然后我们在依次判断牌的种类,如果是Bob的牌,我们就他牌的宽度放入multiset中,如果是Alice的牌就在multiset中找到宽度最大的那一张并删掉。
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<set> using namespace std; const int maxn=200005; struct Node { int h,w,id; }node[maxn]; bool cmp(Node t1,Node t2) { if(t1.h!=t2.h) return t1.h<t2.h; if(t1.w!=t2.w) return t1.w<t2.w; return t1.id<t2.id; } multiset<int > s; multiset<int >::iterator ite; int main() { int n,i,T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=2*n;i++) { scanf("%d%d",&node[i].h,&node[i].w); node[i].id=(i<=n); } sort(node+1,node+2*n+1,cmp); s.clear(); int sum=0; for(i=1;i<=2*n;i++) { if(node[i].id==0) s.insert(node[i].w); else { if(s.empty()||node[i].w<*(s.begin())) continue; ite=s.upper_bound(node[i].w); //查找 ite--; sum++; s.erase(ite); //删除 } } printf("%d\n",sum); } return 0; }
时间: 2024-11-07 03:32:59