HDU 1277 Nested Dolls
2016-05-06 01:29
471 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1677题意:
玩俄罗斯套娃,问最后至少还剩几个。题解:
这题可以和拦截导弹做对比,因为这里是二维的,按w递减h递增的方式来保证在保存的序列中按h升序来排的,从而为二分查找打下基础。否则,如果按h降序排,保存的序列就会无序,二分结果自然不正确了。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn = 20000 + 10; struct Node { int w, h; bool operator < (const Node& tmp) const { return w < tmp.w&&h < tmp.h; } }arr[maxn], dp[maxn]; bool cmp(Node& n1, Node& n2) { return n1.w > n2.w || (n1.w == n2.w) && (n1.h<n2.h); } int n; int main() { int tc; scanf("%d", &tc); while (tc--) { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d%d", &arr[i].w,&arr[i].h); } sort(arr, arr + n, cmp); int ans = 0; dp[++ans] = arr[0]; for (int i = 1; i < n; i++) { //dp按w降序,h升序排的!!!为了维护h是升序排的,必须保证输入中w相等时h按升序排而不是降序 int low = 0, hig = ans; while (low + 1 < hig) { int mid = low + (hig - low) / 2; if (arr[i] < dp[mid]) hig = mid; else low = mid; } if (arr[i] < dp[hig]) { dp[hig] = arr[i]; } else { dp[++ans] = arr[i]; } } printf("%d\n", ans); } return 0; }
相关文章推荐
- Web客户端经验:
- Bootstrap
- JavaScript
- String,StringBuffer,StringBuilder的区别
- 为string类添加一个赋值运算符函数
- CSS3特殊效果
- Linux初级 文件处理命令
- c++ 课堂作业(1)
- CSS总结
- linux--函数劫持--基于LD_PRELOAD
- windows下tomcat日志输出至文件
- CSS框模型,浮动,定位以及其他属性
- CSS基础知识点总结
- Mac hook苹果系统进程监控劫持
- touch事件的多点触控案例和获取touch的属性
- Html基础知识点
- C++第一次课堂作业 circle
- S:SELECT value 表达式
- 面向对象程序设计的基本概念和特征
- 1