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. ...
随机推荐
- windows服务器详细安全设置
1).系统安全基本设置 1.安装说明:系统全部NTFS格式化,重新安装系统(采用原版win2003),安装杀毒软件(Mcafee),并将杀毒软件更新,安装sp2补钉,安装IIS(只安装必须的组件),安 ...
- Win7下更改iTunes备份路径最便捷的方法
① 先删除C:\Users\你的用户名\AppData\Roaming\Apple Computer里的 MobileSync文件夹(首次安装iTunes要先运行一次itunes,才有这个文件夹,如果 ...
- NoSQL摘录
NoSQL泛指非关系型数据库,诸如Cassandra.MongoDB.Neo4J和Riak等.它们主张使用无模式(schemaless)的数据,可以运行在集群环境中. 开源的NoSQL数据库:Redi ...
- log4cxx在linux下的编译使用
最近在linux下使用log4cxx库,按照其官方文档提供的方法来进行编译,不能成功,又利用google搜索了好几个中文博客上讲述在linux下编译使用log4cxx库的方法,依然不能成功,在这里我奉 ...
- 优化数据页面(22)——n:n的数据关系
设计要点:优化数据页面.界面设计.美化exce 阿金:那n::n就复杂了,你倒是想留有空间. 可是现实社会有时却不同意. 秀秀:唉.说的也是. 阿金:那怎么表达才合适啊? 秀秀:仅仅实用网格了. 阿金 ...
- NGUI 取ScrollView中遮罩区域4个点
用panel.localCorners而不是panel.finalClipRegion,Region还要再换算 首先通过ScrollView取panel,然后取Corners,它返回值代表4个点,映射 ...
- DDR3内存详解,存储器结构+时序+初始化过程
DDR3内存详解,存储器结构+时序+初始化过程 标签: DDR3存储器博客 2017-06-17 16:10 1943人阅读 评论(1) 收藏 举报 分类: 硬件开发基础(2) 转自:http:/ ...
- 分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)
一.问题描述 问题: 使用<pg:param name="key" />标签传递中文参数时,会有乱码. 原因: 因为它默认是用gb2312来对添加的参数进行编码,如果你 ...
- poj 3017 Cut the Sequence(单调队列优化 )
题目链接:http://poj.org/problem?id=3017 题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小 分析:这题很快就能想到 ...
- h5-文本框
h5-文本框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...