码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4268 Alice and Bob(贪心+Multiset的应用)

时间:2015-07-26 22:36:56      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:hdu



题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形?

思路:贪心,先按照h将Alice和Bob的矩形排序,对于Alice的每个矩形,如果Bob的矩形的h小于Alice的h,将Bob的w插入到集合中。

然后,在集合中找到不大于Alice矩形d的最大的Bob的d,那么这样做肯定是最优的。

#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<cstdlib>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<queue>  
#include<stack> 
#include<string>
#include<map> 
#include<set>
#define eps 1e-6 
#define LL long long  
using namespace std;  

//const int maxn = 100 + 5;
//const int INF = 0x3f3f3f3f;
struct Card {
	int h, d;
};

Card ca[100010], cb[100010];
bool cmp1(Card A, Card B) {
	return A.h < B.h;
}
multiset<int> ms;

int main() {
//	freopen("input.txt", "r", stdin);
	int t; cin >> t;
	int n; 
	while(t--) {
		cin >> n;
		ms.clear();
		for(int i = 0; i < n; i++) scanf("%d%d", &ca[i].h, &ca[i].d);
		for(int i = 0; i < n; i++) scanf("%d%d", &cb[i].h, &cb[i].d);
		sort(ca, ca+n, cmp1);
		sort(cb, cb+n, cmp1);
		int pos = 0, ans = 0;
		for(int i = 0; i < n; i++) {
			while(pos < n) {
				if(ca[i].h >= cb[pos].h) {
			    	ms.insert(cb[pos].d); pos++; 
				}
				else break;
			}
			if(ms.empty()) continue;
			multiset<int>::iterator it = ms.upper_bound(ca[i].d);
			if(it != ms.begin()) {
				ans++; ms.erase(--it);
			}
		}
		cout << ans << endl;
	}
	return 0;
}






版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 4268 Alice and Bob(贪心+Multiset的应用)

标签:hdu

原文地址:http://blog.csdn.net/u014664226/article/details/47072657

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!