POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)
描述
C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于
第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?
输入
第一行是一个整数T,表示输入数据一共有T组。
每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。
输出
处理这些木棒的最短时间。
样例输入
3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1
样例输出
2
1
3
解题思路:(贪心算法 + 动态规划,就是求单调递减或递增子序列的个数)
1.首先将木棒排序,总体为l递减排序,若len相等,则weight递减。
2.对第i个木棒处理:选出单调递减子序列,并将单调递减子序列标记为true(使用过)。选出后,时间+1.进行第i+1个木棒的处理
代码如下:
#include <stdio.h>
#include <string.h> int getMinTime(int len[], int weight[], int n)
{
int min = , i, j, t;
bool exchange, used[];
int cur; memset(used, false, n); // 冒泡排序O(n^2)
for(i = ; i < n - ; i++)
{
exchange = false; for(j = n - ; j > i; j--)
{
if(len[j] > len[j - ] ||
len[j] == len[j - ] && weight[j] > weight[j - ])
{
t = len[j];
len[j] = len[j - ];
len[j - ] =t; t = weight[j];
weight[j] = weight[j - ];
weight[j - ] =t; exchange = true;
}
} if(!exchange) break;
} for(i = ; i < n; i++)
{
if(!used[i])
{
cur = weight[i]; used[i] = true; for(j = i + ; j < n; j++)
{
if(!used[j] && cur >= weight[j])
{
used[j] = true;
cur = weight[j];
}
} min++;
}
} return min;
} int main()
{
int t, n, i;
int length[], weight[]; scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = ; i < n; i++)
{
scanf("%d%d", &length[i], &weight[i]);
} printf("%d\n", getMinTime(length, weight, n));
} return ;
}
分析:这里采用的是冒泡排序,时间复杂度为O(n^2),可以直接使用库函数sort(时间复杂度为n*log2(n)),这时需要建立一个结构体,将len和weight作为一个整体结构对待,如下:
#include <stdio.h>
#include <string.h>
#include <algorithm> using namespace std; struct Node
{
int len;
int weight;
}node[]; bool cmp(Node a, Node b)
{
if(a.len == b.len)
return a.weight > b.weight;
return a.len > b.len;
} int getMinTime(int n)
{
int min = , i, j;
bool used[];
int cur; memset(used, false, n); // sort直接排序n*log2(n)
sort(node, node + n, cmp); for(i = ; i < n; i++)
{
if(!used[i])
{
cur = node[i].weight; used[i] = true; for(j = i + ; j < n; j++)
{
if(!used[j] && cur >= node[j].weight)
{
used[j] = true;
cur = node[j].weight;
}
} min++;
}
} return min;
} int main()
{
int t, n, i; scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = ; i < n; i++)
{
scanf("%d%d", &node[i].len, &node[i].weight);
} printf("%d\n", getMinTime(n));
} return ;
}
POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)的更多相关文章
- HDU - 1051 Wooden Sticks 贪心 动态规划
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- POJ1065(Wooden Sticks)--贪心
木棍 时间限制: 1000MS 内存限制: 10000K 提交总数: 27336 接受: 11857 描述 有一堆木棍.每根杆的长度和重量是预先已知的.这些木棍将由木工机器逐一加工.它需要一些 ...
- 1270: Wooden Sticks [贪心]
点击打开链接 1270: Wooden Sticks [贪心] 时间限制: 1 Sec 内存限制: 128 MB 提交: 31 解决: 11 统计 题目描述 Lialosiu要制作木棍,给n根作为原料 ...
- HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)
嘤嘤嘤,实习半年多的小蒟蒻的第一篇博客(题解) 英文的: There is a pile of n wooden sticks. The length and weight of each stick ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu1051 Wooden Sticks(贪心+排序,逻辑)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDOJ.1051 Wooden Sticks (贪心)
Wooden Sticks 点我挑战题目 题意分析 给出T组数据,每组数据有n对数,分别代表每个木棍的长度l和重量w.第一个木棍加工需要1min的准备准备时间,对于刚刚经加工过的木棍,如果接下来的木棍 ...
- HDU 1051 Wooden Sticks (贪心)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- uvalive 2322 Wooden Sticks(贪心)
题目连接:2322 Wooden Sticks 题目大意:给出要求切的n个小木棍 , 每个小木棍有长度和重量,因为当要切的长度和重量分别大于前面一个的长度和重量的时候可以不用调整大木棍直接切割, 否则 ...
随机推荐
- 解决mac安装homebrew后报错-bash: brew: command not found
解决mac安装homebrew后报错-bash: brew: command not found 参照官网上很简单的一句安装命令, /usr/bin/ruby -e "$(curl ...
- flask + apidoc 生成接口文档(附加一个坑)
具体使用方法见这里 https://blog.csdn.net/lynnyq/article/details/79254290 挺详细的,我就不抄了. 重点是一个坑: 执行 python manage ...
- Beta阶段第一篇 Scrum 冲刺博客
介绍小组新加入的成员,Ta担任的角色 新成员 担任角色 张晨晨 测试 理由:晨晨代码能力有待提高,但心思细腻有耐心,适合测试工作. 讨论是否需要更换团队的PM 通过团队讨论决定不更换团队PM,理由是在 ...
- redis简单使用
主要参考资料:http://wiki.jikexueyuan.com/project/redis-guide/data-type.html一.redis 安装1.在官网下载安装包2.解压安装包 tar ...
- nutch相关目录说明
Nutch数据包含3个目录结构,分别是: 1.Crawldb:用于存储Nutch将要检索的url信息,以及检索状态(是否检索.何时检索) 2.Linkdb:用于存储每一个url所包含的超链接信息(包括 ...
- SRM472
这次是rng_58出的题目,思维难度还是相当大的的..很值得一做. 250pt: 题意:盒子里有n 个 potatoes,甲乙两个人,每次只能拿4的幂次方数(1,4,16...),最后不能拿的输.求谁 ...
- 开发 C# OPC 客户端
编写 opc 客户端的思路 1. 使用OPC Client浏览服务器, 查看测试代码修改后的结果. 2. 根据OPC Client搜集到的服务器信息编写代码和服务器交互 3. OPC Client 操 ...
- 《AngularJS深度剖析与最佳实践》笔记: 第二章 概念介绍
第二章 概念介绍 2.1 什么是UI? 用户界面包括内容(静态信息+动态信息), 外观, 交互. 在前端技术栈中分别由HTML, CSS和JS负责. 进一步抽象, 分别对应于MVC三个主要部分: Mo ...
- 【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景
本文将从以下11点介绍javascript和PHP在基础语法和基本操作上的异同: 1.数据类型的异同 2.常量和变量的定义的不同,字符串连接运算符不同 3.对象的创建方法的不同 4.PHP与JS在变 ...
- 【SPOJ10707】 COT2 Count on a tree II
SPOJ10707 COT2 Count on a tree II Solution 我会强制在线版本! Solution戳这里 代码实现 #include<stdio.h> #inclu ...