题意: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