标签:
题义大概就是A有一些卡片,B有一些卡片,A的卡片能覆盖B卡片最多多少张(只有长和宽同时大于等于才行)
#include <bits/stdc++.h> using namespace std; #define Maxn 100010 struct Node{ int x,y,id; }; Node G[Maxn*2]; bool cmp(Node n1,Node n2){ if(n1.x == n2.x && n2.y == n2.y) return n1.id > n2.id; //这里注意排序方式 if(n1.x != n2.x) return n1.x > n2.x; return n1.y > n2.y; } int main() { int N; cin >> N; while(N--){ int n,t; cin >> n; for(int i = 0; i <(n<<1); i++){ scanf("%d%d",&G[i].x,&G[i].y); if(i < n){ G[i].id = 1; }else{ G[i].id = 0; } } sort(G,G+(n<<1),cmp); multiset<int>s; int cnt = 0; for(int i = 0; i < (n<<1); i++){ // 这里用了贪心的方法,因为已经排序了,按照从x从小到大的顺序 // 如果是A,放入容器,如果是B,就从A中找到比B大的中的最小的(贪心) if(G[i].id){ s.insert(G[i].y); }else{ multiset<int>::iterator it = s.lower_bound(G[i].y); if(it == s.end() || *it < G[i].y){ // 这步判断很重要 continue; }else{ cnt++; s.erase(it); // 找到就删掉,以后都不再用了 } } } printf("%d\n",cnt); } }
标签:
原文地址:http://www.cnblogs.com/yakoazz/p/5767886.html