poj3636
题意:每个物品有两个属性:长和宽(长宽不可互换)。如果一个物品的长和宽均大于另一个物品,则这个物品可以罩住另一个物品,用这种罩住物品的方法将物品分组,一组之内的物品可以一个罩住一个的全部罩起来。问最少分成几组?
分析:通常这种问题是问物品最多的一组有多少个,这个问题则稍有不同。有人说要用到Dilworth定理,个人认为没什么关系。我们的做法是将物品先按照长从小到大排序。还有一个数组,用来存储当前每个分组的罩在最外层的长和宽,开始该数组为空。然后从小到大每次取出所有长度相等的物品,扣在当前的分组数组中的物品上,更新数组中存储的长宽值。这样长度相等的一起扣,在判断能不能扣的上的时候就不需要考虑长度了,之前扣好的都是长度小于当前物品的。在扣的过程中要注意发挥每个物品的最大能力,即让每个物品扣住刚好比它小一点点的物品。因为假设如果物品X不去扣比它小一点的那个物品A,而去扣比它小很多的那个物品B。而另一个物品Y,本来只能扣B不能扣A,又因为B已经被X扣了,Y只能单成一组,造成组数增加。在实际操作中是先拿当前长度的那个宽度最大的,发挥其最大作用,然后宽度次大的……为了程序实现起来简便,我们可以直接将所有物品按长度升序,宽度降序来排序,这样每次取出一个物品加入到分组中,就相当与我们刚才的操作了。
#include <cstdio>
#include <algorithm>
using namespace std; #define MAX_DOLL_NUM 20004 struct Doll
{
int width, height;
}doll[MAX_DOLL_NUM], chain[MAX_DOLL_NUM]; int doll_num;
int chain_cnt; bool operator < (const Doll &a, const Doll &b)
{
if (a.width == b.width)
return a.height > b.height;
return a.width < b.width;
} void input()
{
scanf("%d", &doll_num);
for (int i = ; i < doll_num; i++)
scanf("%d%d", &doll[i].width, &doll[i].height);
} bool fit(Doll a, Doll b)
{
return a.width > b.width && a.height > b.height;
} void work()
{
chain_cnt = ;
for (int i = ; i < doll_num; i++)
{
bool fitted = false;
for (int j = ; j < chain_cnt; j++)
if (fit(doll[i], chain[j]))
{
fitted = true;
chain[j] = doll[i];
//printf("%d %d\n", i, j);
//printf("%d %d %d %d\n", doll[i].width, doll[i].height, chain[i].width, chain[i].height);
break;
}
if (!fitted)
{
//printf("%d %d\n", doll[i].width, doll[i].height);
chain[chain_cnt++] = doll[i];
}
}
} int main()
{
int t;
scanf("%d", &t);
while (t--)
{
input();
sort(doll, doll + doll_num);
work();
printf("%d\n", chain_cnt);
}
return ;
}
poj3636的更多相关文章
- POJ1065Wooden Sticks[DP LIS]
Wooden Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21902 Accepted: 9353 De ...
- POJ3636Nested Dolls[DP LIS]
Nested Dolls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8323 Accepted: 2262 Desc ...
- ACM学习大纲
1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...
- ACM训练大纲
1. 算法总结及推荐题目 1.1 C++ STL • STL容器: set, map, vector, priority_queue, queue, stack, deque, bitset• STL ...
- ACM学习大纲(转)
1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...
随机推荐
- bzoj4385 & POJ2015 Wilcze doły
Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...
- AFO NOI2018退役——菜鸡一直是菜鸡
游记DAY -INF连续几天的模拟让我确信我就是菜鸡.以及相信yxd,sjq,cyl神犇一定能够稳了. DAY 0报道,天很热热热热热热热热热. DAY 1开幕式,杜子德很热热热热热热热热热. DAY ...
- NOI前总结
最近也就是天天考试,总结一下. 7.1 开场T1T2都是不可做的概率期望,只有T3看起来可做,于是怒干4h+,将题解里面的所有结论都推出来了,大模拟写的一点毛病都没有,可还是因为2-SAT掌握不熟结果 ...
- 【bzoj4804】欧拉心算 解题报告
[bzoj4804]欧拉心算 Description 给出一个数字\(N\),计算 \[\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\] Input 第一行为 ...
- 编译安装nrpe,配置监控mysql端口和主从状态
1.安装插件 # tar xvf nagios-plugins-1.4.13.tar.gz # cd nagios-plugins-1.4.13 # ./configure # make && ...
- java多线程 -- Condition 控制线程通信
Api文档如此定义: Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对 ...
- 添加jar包需注意
对于纯java项目使用的是本地自己的JRE,通过build path导入的JAR包的配置信息会出现在应用的”.classpath”文件中,ClassLoader会智能地去加载这些JAR. 而Web项目 ...
- php 中的错误处理机制
php 里有一套错误处理机制,可以使用 set_error_handler 接管 php 错误处理,也可以使用 trigger_error 函数主动抛出一个错误. set_error_handler( ...
- 共享内存shm*(生产者和消费者)
//heads.h #ifndef HEAD_H #define HEAD_H #include <iostream> #include <sys/shm.h> //share ...
- P1564 膜拜
P1564 膜拜 题目描述 神牛有很多-当然-每个同学都有自己衷心膜拜的神牛. 某学校有两位神牛,神牛甲和神牛乙.新入学的N 位同学们早已耳闻他们的神话. 所以,已经衷心地膜拜其中一位了.现在,老师要 ...