题目描述

LYK出了道水题。

这个水题是这样的:有两副牌,每副牌都有n张。

对于第一副牌的每张牌长和宽分别是xi和yi。对于第二副牌的每张牌长和宽分别是aj和bj。第一副牌的第i张牌能覆盖第二副牌的第j张牌当且仅当xi>=aj并且yi>=bj。(注意牌不能翻转)当然一张牌只能去覆盖最多一张牌,而不能覆盖好多张。

LYK想让两副牌的各n张一一对应叠起来。它想知道第二副牌最多有几张能被第一副牌所覆盖。

输入格式(water.in)

第一行一个数n。

接下来n行,每行两个数xi,yi。

接下来n行,每行两个数aj,bj。

输出格式(water.out)

输出一个数表示答案。

输入样例

3

2 3

5 7

6 8

4 1

2 5

3 4

输出样例

2

数据范围

对于50%的数据n<=10。

对于80%的数据n<=1000。

对于100%的数据1<=n<=100000,1<=xi,yi,aj,bj<=10^9。

分析:一眼贪心题,覆盖的两张牌肯定是要让它们的x,y的差值尽量小才是最优的,因为这样就把更多的选择留给了其它的牌.那么先把所有牌按照x从小到大排序,然后在第二副牌中把a[j] <= x[i]的牌的b放进一个multiset中,每次取与y[i]最相近的一个b值即可.

multiset是一个可重复的set,里面的元素都是排好序的,upper_bound的返回看multiset中数的情况而定,如果upper_bound(a[i]),multiset中存在了a[i],就返回所有a[i]中最后面一个的迭代器,如果不存在,就返回第一个大于a[i]的迭代器,因为要求<=的嘛,方便起见迭代器减一下就好了.

#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; struct node
{
int x, y;
}a[],b[]; int n, k, ans; bool cmp(node a, node b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d%d", &a[i].x, &a[i].y);
for (int i = ; i <= n; i++)
scanf("%d%d", &b[i].x, &b[i].y);
sort(a + , a + + n, cmp);
sort(b + , b + + n, cmp);
multiset <int> s;
k = ;
for (int i = ; i <= n; i++)
{
while (k <= n && a[i].x >= b[k].x)
{
s.insert(b[k].y);
k++;
} multiset <int>::iterator it = s.upper_bound(a[i].y);
if (it == s.begin())
continue;
it--;
s.erase(it); ans++;
}
printf("%d\n", ans); return ;
}

最新文章

  1. 【WCF】自定义错误处理(IErrorHandler接口的用法)
  2. K-Means clusternig example with Python and Scikit-learn(推荐)
  3. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
  4. Android开发学习---使用XmlPullParser解析xml文件
  5. python 爬虫1
  6. 2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)
  7. 设计模式学习之迭代器模式(Iterator,行为型模式)(17)
  8. c#选择填空题题库
  9. 第40讲:Set、Map、TreeSet、TreeMap操作代码实战
  10. linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
  11. Thinkpad Edge E440 Ubuntu14.04 无线网卡驱动 解决
  12. 使用VS Code开发Angular 2应用程序所需配置文件的解析
  13. 与后台进行连接,mysql模块 第六篇
  14. pcap文件格式解析
  15. JPush 使用教程
  16. ##5.1 Nova控制节点-- openstack pike
  17. Android热修复技术原理详解(最新最全版本)
  18. vue调用支付接口
  19. 实用方法 - 解决360Doc文章不能复制的问题(实现不登录直接复制)
  20. 如何计算 App 的启动时间

热门文章

  1. PKUACM 2018 D chocolate【并查集+克鲁斯卡尔】
  2. C++小项目-吃豆子游戏
  3. Android 性能优化(19)*代码优化11条技巧:Performance Tips
  4. cocos creator 场景如何透明,多个canvas层级显示
  5. Spark学习之键值对(pair RDD)操作(3)
  6. cookie、json详解
  7. vue路由传参(学习心得)
  8. 【Linux】centos7 添加脚本到/etc/rc.local文件里,实现开机自启
  9. 梦想CAD控件com接口扩展数据
  10. Eigen库笔记整理(一)