题意:Alice与Bob在玩卡片游戏,他们每人有n张卡片,若Alice的一张卡片长与宽都不小于Bob的一张卡片,则Bob的卡片就会被盖住,一张卡片只可以使用一次,且不可旋转求Alice最多可以盖住多少张Bob的卡片。
思路:记录两人卡片情况,并按照长度将两人卡片分别降序排序。遍历两人的卡片,将长度小于Alice的卡片长度的Bob卡片的宽度插入multiset中,在multiset中找到小于等于Alice卡片宽度的第一个数,将这个数给消去且答案+1.//贪心法自行发挥即可。
code:
/* * @author Novicer * language : C++/C */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<cctype> #include<cmath> #include<ctime> #include<iomanip> using namespace std; const double eps(1e-8); typedef long long lint; //const int maxn = 2*100000 + 5; multiset<int>Bob; //multiset<pair>Alice; struct card{ int x,y; }; bool cmp(card a, card b){ if(a.x != b.x) return a.x < b.x; else return a.y < b.y; } card al[100005],bo[100005]; int n; int main(){ freopen("input.txt","r",stdin); int T; cin >> T; while(T--){ cin >> n; for(int i = 1 ; i <= n ; i++){ scanf("%d%d",&al[i].x,&al[i].y); } for(int i = 1 ; i <= n ; i++){ scanf("%d%d",&bo[i].x,&bo[i].y); } sort(al+1 , al+n+1 , cmp); sort(bo+1 , bo+n+1 , cmp); // cout << al[1].x << al[1].y << endl; Bob.clear(); multiset<int>::iterator it; int ans = 0; for(int i = 1,j = 1 ; i <= n ; i++){ for( ; j <= n ; j++){ if(al[i].x >= bo[j].x) Bob.insert(bo[j].y); else break; } // cout << Bob.size() << endl; if(Bob.empty()) continue; it = Bob.lower_bound(al[i].y); if(it != Bob.begin()) it--; if(*it <= al[i].y){ ans++; Bob.erase(it); } } cout << ans << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 4268 Alice and Bob(贪心+multiset)
原文地址:http://blog.csdn.net/qq_15714857/article/details/47072175