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

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

  原题传送:

  贪心算法。

  对a、b数组进行二维排序(先按长h从小到大排序,相同的h按宽w从小到大排序),对于b的h小于a的h,把b的w添加到集合中,并从集合里面选择一个可以覆盖的最大的w即可(因为此时由于第一维h已经满足覆盖条件,只需要考虑第二维的w)。

  这道题在比赛的时候没做出来,后来看了解题报告,才发现STL神器之multiset,这就是比赛时苦苦寻找的数据结构啊!这东西自己从来没用过的,此刻必须记录下它的两个重要特点:

  1.它有优先队列的性质,插入的元素是有序的,插入复杂度和priority_queue一样只有O(log(n));

  2.它有两个很好用的方法:

    a.lower_bound(key):返回指向第一个">=key"的元素的迭代指针;

    b.upper_bound(key):返回指向第一个">key"的元素的迭代指针;

  (这两个方法都是O(log(n))复杂度,很高效),并且删除操作也很容易。

View Code
1 #include 
2 #include
3 #include
4 #define N 100001 5 using namespace std; 6 7 struct node 8 { 9 int h, w;10 }a[N], b[N];11 12 multiset
s;13 14 bool cmp(node x, node y)15 {16 if(x.h < y.h)17 return true;18 else if(x.h == y.h)19 return x.w < y.w ? true : false;20 else 21 return false;22 }23 24 int main()25 {26 int n, i, j, cas, cnt;27 scanf("%d", &cas);28 while(cas --)29 {30 s.clear();31 scanf("%d", &n);32 for(i = 0; i < n; i ++)33 scanf("%d%d", &a[i].h, &a[i].w);34 for(i = 0; i < n; i ++)35 scanf("%d%d", &b[i].h, &b[i].w);36 sort(a, a + n, cmp);37 sort(b, b + n, cmp);38 for(cnt = i = j = 0; i < n; i++)39 {40 while(j < n && b[j].h <= a[i].h)41 {42 s.insert(b[j].w);43 j ++;44 }45 if(!s.empty() && *s.begin() <= a[i].w)46 {47 multiset
::iterator it = s.upper_bound(a[i].w);48 cnt ++;49 it --;50 s.erase(it);51 }52 }53 printf("%d\n", cnt);54 }55 return 0;56 }

 

  

转载于:https://www.cnblogs.com/huangfeihome/archive/2012/09/17/2688826.html

你可能感兴趣的文章
Android_去掉EditText控件周围橙色高亮区域
查看>>
《构建之法》第一、二、十六章阅读笔记
查看>>
arrow:让Python的日期与时间变的更好
查看>>
(转)Excel的 OleDb 连接串的格式(连接Excel 2003-2013)
查看>>
Java并发编程
查看>>
Git Stash用法
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
postgressql数据库中limit offset使用
查看>>
测试思想-集成测试 关于接口测试 Part 2
查看>>
windows下mysql密码忘了怎么办?【转】
查看>>
php生成器使用总结
查看>>
T-SQL中的indexof函数
查看>>
javascript基础之数组(Array)对象
查看>>
mysql DML DDL DCL
查看>>
RAMPS1.4 3d打印控制板接线与测试1
查看>>
python with语句中的变量有作用域吗?
查看>>
24@Servlet_day03
查看>>
初级ant的学习
查看>>
memcached 细究(三)
查看>>