描述

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(贪心+动态规划——单调递减或递增序列)的更多相关文章

  1. HDU - 1051 Wooden Sticks 贪心 动态规划

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)    ...

  2. POJ1065(Wooden Sticks)--贪心

    木棍 时间限制: 1000MS   内存限制: 10000K 提交总数: 27336   接受: 11857 描述 有一堆木棍.每根杆的长度和重量是预先已知的.这些木棍将由木工机器逐一加工.它需要一些 ...

  3. 1270: Wooden Sticks [贪心]

    点击打开链接 1270: Wooden Sticks [贪心] 时间限制: 1 Sec 内存限制: 128 MB 提交: 31 解决: 11 统计 题目描述 Lialosiu要制作木棍,给n根作为原料 ...

  4. HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)

    嘤嘤嘤,实习半年多的小蒟蒻的第一篇博客(题解) 英文的: There is a pile of n wooden sticks. The length and weight of each stick ...

  5. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. hdu1051 Wooden Sticks(贪心+排序,逻辑)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. HDOJ.1051 Wooden Sticks (贪心)

    Wooden Sticks 点我挑战题目 题意分析 给出T组数据,每组数据有n对数,分别代表每个木棍的长度l和重量w.第一个木棍加工需要1min的准备准备时间,对于刚刚经加工过的木棍,如果接下来的木棍 ...

  8. HDU 1051 Wooden Sticks (贪心)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  9. uvalive 2322 Wooden Sticks(贪心)

    题目连接:2322 Wooden Sticks 题目大意:给出要求切的n个小木棍 , 每个小木棍有长度和重量,因为当要切的长度和重量分别大于前面一个的长度和重量的时候可以不用调整大木棍直接切割, 否则 ...

随机推荐

  1. (最长上升子序列 并记录过程)FatMouse's Speed -- hdu -- 1160

    http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Other ...

  2. js 判断字符串中是否包含某个字符串(转载)

    from : https://www.cnblogs.com/ooo0/p/7741651.html String对象的方法 方法一: indexOf()   (推荐) var str = " ...

  3. web-day12

    第12章WEB12-JSP&EL&JSTL篇 今日任务 商品信息的显示 教学导航 教学目标 掌握JSP的基本的使用 掌握EL的表达式的用法 掌握JSTL的常用标签的使用 教学方法 案例 ...

  4. 【Android开发那点破事】打开APP加载页面实现

    今天的破事呢就说说APP加载页面的实现.一般情况下,当APP打开的时候,我们需要做很多事情,比如检查网络连接啊,初始化一些配置啊等等.我们可以让这些事情在APP完全打开之前做完,然后呢在打开的过程中显 ...

  5. AngularJS $eval $parse

    $eval $parse都可以解析或计算Angular表达式的值. 一.$parse 是一个独立的可以注入的服务,注入就可以使用,它返回一个函数,我们需要显式将表达式求值的上下文传递给该函数.$par ...

  6. double float的精度问题

    三部曲 1: #include <iostream> #include <stdio.h> #include <string.h> using namespace ...

  7. 【xcode中添加pch全局引用文件】

    前沿:xcode6中去掉了pch,为了一些琐碎的头文件引用,加快了 编译速度! xcode6之前的版本建项目就自动添加了是这样的: xcode6后的版本要自己手动的添加步骤如下: 1)  2) 3)  ...

  8. 【抄袭】VB.NET扩展WebBrowser,拥有跳转前获取URL的能力

    来自 http://www.cnblogs.com/yuanjw/archive/2009/02/09/1386789.html 我仅做VB化,并优化了事件消息 Imports System.Comp ...

  9. WPF DataGrid分组和排序

    之前一直用的Dev的GridControl,控件自带分组排序啥的.今天试了下在wpf自带的Datagrid控件上实现分组和排序. Datagrid上实现这些功能主要用到CollectionViewSo ...

  10. EF架构获取数据时报错:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. Do you want to correct the value?

    场景: EF底层,获取完主表,点击按钮,添加主表,字表内容时,报以上错误 解决方案: 在EF文件的空白处右键--属性,将“应用延迟加载”,改为False