hdu 1677 Nested Dolls【贪心解嵌套娃娃问题】
链接:
Nested DollsTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
Dilworth is the world’s most prominent collector of Russian nested dolls: he literally has thousands of them! You know, the wooden hollow dolls of different sizes of which the smallest doll is contained in the second smallest, and this doll is in turn contained
in the next one and so forth. One day he wonders if there is another way of nesting them so he will end up with fewer nested dolls? After all, that would make his collection even more magnificent! He unpacks each nested doll and measures the width and height of each contained doll. A doll with width w1 and height h1 will fit in another doll of width w2 and height h2 if and only if w1 < w2 and h1 < h2. Can you help him calculate the smallest number of nested dolls possible to assemble from his massive list of measurements?
Input
On the first line of input is a single positive integer 1 <= t <= 20 specifying the number of test cases to follow. Each test case begins with a positive integer 1 <= m <= 20000 on a line of itself telling the number of dolls in the test case. Next follow 2m
positive integers w1, h1,w2, h2, . . . ,wm, hm, where wi is the width and hi is the height of doll number i. 1 <= wi, hi <= 10000 for all i.
Output
For each test case there should be one line of output containing the minimum number of nested dolls possible.
Sample Input
Sample Output
Source
Recommend
lcy
|
题意:
当且仅当 d1.w < d2.w && d1.h < d2.h , d1 才可以放入 d2中
问:最少还可以剩下几个娃娃
算法:应该是要用 dp 做了,这里用贪心Orz
最后发现都一样,贪心还是 DP , 分析了 hdu 1257 就知道了Orz
思路:
关于排序:
对于 w 相同时 h 从小到大排序
如果 m 个 w 相同, 那么必然是嵌套在 m 个不同的娃娃中
【可能是比它大的,也可能是它本身】
先选择 h 最小的嵌入到前面能够满足条件的娃娃中,
再新用一个娃娃嵌套 h 倒数第二小的娃娃,
那么这时嵌套了第二个娃娃的东西,一定能比已经嵌套了第个一的更能嵌套其它的娃娃 w 相同 ,而 h 更优【h大】
5
30 400 (1)
10 200 (1)
10 300 (2) w 相同,必然重新嵌入不同的娃娃
9 250 (2)
8 250 (3)
那么最优的结果就是 3,
第一个娃娃嵌套第二个;
第三个娃娃嵌套第四个;
第五个娃娃单独嵌套。
但是如果你按照 w 相同时 h 从大到小排序就是这样
5
30 400 (1)
10 300 (1)
10 200 (2)
9 250 (3)
8 250 (4)
一样的数据, 答案是 4
code:
/***************************************************************************************** E Accepted 540 KB 343 ms C++ 1172 B 2013-08-04 21:16:03 题意:给你 N 个娃娃, 每个娃娃有特定的 w 和 h
当且仅当 d1.w < d2.w && d1.h < d2.h , d1 才可以放入 d2中
问:最少还可以剩下几个娃娃
算法:应该是要用 dp 做了,这里用贪心Orz
思路:感觉类似于导弹拦截系统
先对娃娃们排序:先按照 w 从大到小排序, w 相同,则按照 h 从小到大排序
关于排序:先按照 w 从大到小排序可以理解吧【把小的嵌套到大的当中去】
对于 w 相同时 h 从小到大排序
如果 m 个 w 相同, 那么必然是嵌套在 m 个不同的娃娃中
【可能是比它大的,也可能是它本身】
先选择 h 最小的嵌入到前面能够满足条件的娃娃中,
再新用一个娃娃嵌套 h 倒数第二小的娃娃,
那么这时嵌套了第二个娃娃的东西,一定能比已经嵌套了第个一的更能嵌套其它的娃娃 w 相同 ,而 h 更优【h大】
比如说这堆娃娃有这样几个娃娃
5
30 400 (1)
10 200 (1)
10 300 (2) w 相同,必然重新嵌入不同的娃娃
9 250 (2)
8 250 (3)
那么最优的结果就是 3,
第一个娃娃嵌套第二个;
第三个娃娃嵌套第四个;
第五个娃娃单独嵌套。 但是如果你按照 w 相同时 h 从大到小排序就是这样
5
30 400 (1)
10 300 (1)
10 200 (2)
9 250 (3)
8 250 (4)
一样的数据, 答案是 4 *****************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std; const int maxn = 20000+10;
const int INF = 10000+10; struct Node
{
int w,h;
}node[maxn], dp[maxn]; bool cmp(Node a, Node b)
{
if(a.w == b.w) return a.h < b.h;
else return a.w > b.w;
} int main()
{
int T;
int n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d%d", &node[i].w, &node[i].h);
dp[i].w = dp[i].h = INF; //假设初始化有 N 个可以嵌套的娃娃
}
sort(node, node+n, cmp);
//for(int i = 0; i < n; i++) printf("%d %d\n", node[i].w, node[i].h); printf("\n"); for(int i = 0; i < n; i++)
{
int j = 0;
while(dp[j].w <= node[i].w || dp[j].h <= node[i].h) j++;
dp[j].w = node[i].w; //不断更新为当前情况
dp[j].h = node[i].h;
} // for(int i = 0; i < n; i++) printf("%d %d\n", dp[i].w, dp[i].h); printf("\n"); int ans = 0;
for(int i = 0; i < n; i++)
if(dp[i].h != INF) //看有几个嵌套过
ans++; printf("%d\n", ans);
}
return 0;
}
hdu 1677 Nested Dolls【贪心解嵌套娃娃问题】的更多相关文章
- HDU 1677 Nested Dolls
过了之后感觉曾经真的做过这样的类型的题. 之前一直非常疑惑二级排序的优先级问题,如今发现二级排序真的没有绝对的优先级. 对于此题,若按W排序,则有1到i件物品的W均小于等于第i+1件物品(设为A)的W ...
- Nested Dolls 贪心 + dp
G: Nested Dolls Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 99 Solved: 19 Descript ...
- HDU 1277 Nested Dolls
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1677 题意: 玩俄罗斯套娃,问最后至少还剩几个. 题解: 这题可以和拦截导弹做对比,因为这里是二维的 ...
- hdu----(1677)Nested Dolls(DP/LIS(二维))
Nested Dolls Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 子查询解嵌套in改写为exists
SELECT * FROM (SELECT pubformdat0_.id id332_, pubformdat0_.domain_id domain2_332_, pubformdat0_.proc ...
- HDU 1677
Nested Dolls Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 4442 Physical Examination(贪心)
HDU 4442 Physical Examination(贪心) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=4442 Descripti ...
- [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器
Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...
- [LeetCode] Nested List Weight Sum 嵌套链表权重和
Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...
随机推荐
- WebKit(Blink分支)各组件的创建与逻辑关系
从render_view_impl.cc開始说起. 1. 方法RenderViewImpl::Initialize中有: WebLocalFrame* web_frame = WebLocal ...
- xgboost 自定义目标函数和评估函数
https://zhpmatrix.github.io/2017/06/29/custom-xgboost/ https://www.cnblogs.com/silence-gtx/p/5812012 ...
- Lintcode---线段树的构造
线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 end 由 build ...
- python 2,3版本自动识别导入
import sys if str(sys.version[0]) == "3": from urllib.parse import quote_plus from ...
- 哪个线程执行 CompletableFuture’s tasks 和 callbacks?
CompletableFuture尽管在2014年的三月随着Java8被提出来,但它现在仍然是一种相对较新潮的概念.但也许这个类不为人所熟知是好事,因为它很容易被滥用,特别是涉及到使用线程和线程池的时 ...
- linux学习笔记18---目录结构
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统至关重要,下面 ...
- 解决Linux环境下Tomcat启动卡住问题
最近发现在服务器上启动tomcat,会存在卡住的情况,这种情况是每次必现,通过搜索发现是随机数生成问题.解决方案如下 将$JAVA_HOME/jre/lib/security/Java.securit ...
- 自己动手搞定支付宝手机Wap网站支付接口 FOR ECShop
支付宝WAP网站版本的支付接口网上整合的比较少,看到很多网站在卖,顿觉无语. 主要是得自己查看支付宝官方提供的SDK中的开发文档. 支付宝sdk下载地址:https://doc.open.alipay ...
- I帧、B帧、P帧、NALU类型
i帧 i frame,即内部画面 intra picture,通常是GOP的第一个帧(即IDR)I帧是最大去除图像空间冗余信息而压缩得到的帧,自带全部信息,不参考其他帧可独立解码,称为帧内编码帧所有视 ...
- CSS border-style 属性查询
border-style 属性用于设置元素所有边框的样式,或者单独地为各边设置边框样式.只有当这个值不是 none 时边框才可能出现. none solid dotted dashed double ...