博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU4268 Alice and Bob 【贪心】
阅读量:6081 次
发布时间:2019-06-20

本文共 2296 字,大约阅读时间需要 7 分钟。

Alice and Bob

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2869    Accepted Submission(s): 926
Problem Description
Alice and Bob's game never ends. Today, they introduce a new game. In this game, both of them have N different rectangular cards respectively. Alice wants to use his cards to cover Bob's. The card A can cover the card B if the height of A is not smaller than B and the width of A is not smaller than B. As the best programmer, you are asked to compute the maximal number of Bob's cards that Alice can cover.
Please pay attention that each card can be used only once and the cards cannot be rotated.
 
Input
The first line of the input is a number T (T <= 40) which means the number of test cases.
For each case, the first line is a number N which means the number of cards that Alice and Bob have respectively. Each of the following N (N <= 100,000) lines contains two integers h (h <= 1,000,000,000) and w (w <= 1,000,000,000) which means the height and width of Alice's card, then the following N lines means that of Bob's.
 
Output
For each test case, output an answer using one line which contains just one number.
 
Sample Input
 
2 2 1 2 3 4 2 3 4 5 3 2 3 5 7 6 8 4 1 2 5 3 4
 
Sample Output
 
1 2
 
Source
 

题意:一个物品有两个參数x,y,当且仅当a物品的x不小于b物品的x且a物品的y不小于b物品的y时a物品能覆盖b物品。如今有个a物品的集合和b物品的集合,问a集合最多能覆盖多少个b集合中的物品。

题解:对两个集合依照x进行升序排序,然后对a集合中的每一个物品,在x满足的情况下。将相应的b集合中的物品扔入multiset中,然后在multiset中寻找y值最大的合法值,若找到++ans并将该值erase;

#include 
#include
#include
#include
using namespace std;#define maxn 100010#define inf 0x7fffffffstruct Node { int x, y;} A[maxn], B[maxn];int n;bool cmp(Node a, Node b) { return a.x < b.x;}int main() { int t, i, j, ans; scanf("%d", &t); while(t--) { multiset
mst; multiset
::iterator it; scanf("%d", &n); for(i = 0; i < n; ++i) scanf("%d%d", &A[i].x, &A[i].y); for(i = 0; i < n; ++i) scanf("%d%d", &B[i].x, &B[i].y); sort(A, A + n, cmp); sort(B, B + n, cmp); ans = 0; for(i = j = 0; i < n; ++i) { for( ; j < n && A[i].x >= B[j].x; ++j) { mst.insert(B[j].y); } if(mst.empty()) continue; it = mst.lower_bound(A[i].y); if(*--it <= A[i].y) { ++ans; mst.erase(it); } } printf("%d\n", ans); } return 0;}

转载地址:http://ykkwa.baihongyu.com/

你可能感兴趣的文章
低版本Samba无法挂载
查看>>
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>