(hdu step 1.3.6)Wooden Sticks(求长度和重量都严格递增的数列的个数)

题目:

Wooden Sticks

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2374 Accepted Submission(s): 921
 

Problem Description

There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to prepare processing a stick. The setup times are associated with cleaning operations and changing tools and shapes in the machine. The setup times of the woodworking machine are given as follows:

(a) The setup time for the first wooden stick is 1 minute. 
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l‘ and weight w‘ if l<=l‘ and w<=w‘. Otherwise, it will need 1 minute for setup.

You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).


Input

The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, ..., ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.


Output

The output should contain the minimum setup time in minutes, one per line.


Sample Input

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


Sample Output

2
1
3

 

Source

Asia 2001, Taejon (South Korea)

题目大意:

给n根木棍的长度和重量。根据要求求出制作木棍的最短时间。建立第一个木棍需要1分钟,若是接着要制作的木棍重量和长度都比此木棍长就不需要建立的时间,若是没有,则再需要建立时间。求时间最小为多少。

题目分析:

一道贪心题,利用有序化数据进行贪心选择。其实就是求长度和重量都严格递增的数字序列的个数。

先按长度进行排序。排序完后的不一定都是下一根木棍重量和长度都大于前一根的。

代码如下:

/*
 * f.cpp
 *
 *  Created on: 2015年1月29日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 5005;

struct Node {
	int length;
	int weight;
	bool vis;
} node[maxn];

bool cmp(Node a, Node b) {
	if (a.length != b.length) {
		return a.length < b.length;
	}

	return a.weight < b.weight;
}

void printNodes(Node nodes[], int n) {
	int i;
	for (i = 0; i < n; ++i) {
		printf("(%d,%d)\n", nodes[i].length, nodes[i].weight);
	}
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		int n;
		scanf("%d", &n);

		int i;
		for (i = 0; i < n; ++i) {
			scanf("%d%d", &node[i].length, &node[i].weight);
			node[i].vis = false;
		}

		sort(node, node + n, cmp);//先对数据进行排序

//		printNodes(node,n);//用来测试排序以后的数据序列

		int ans = 0;//最后的长度和重量都严格递增的数列的个数

		int j;
		for (i = 0; i < n; ++i) {//遍历这个数列中的每一个数

			if (node[i].vis == false) {//如果这一个数还没有被访问过
				node[i].vis = true;//那么将这个鼠标纪委已经访问
				ans++;//结果+1

				int weight = node[i].weight ;//标记当前的重量
				for (j = i + 1; j < n; ++j) {//扫描当前元素后面的所有元素
					//如果后面的元素没有被访问过&&后面的元素比当前元素的重量大 (因为排序以后长度默认已经是升序)
					if ((node[j].vis == false) && (node[j].weight >= weight)) {
						node[j].vis = true;//将该元素标记为已经访问过
						weight = node[j].weight;//并且更新当前的重量值
					}
				}
			}

		}

		printf("%d\n", ans);
	}

	return 0;
}
时间: 2024-12-28 06:20:52

(hdu step 1.3.6)Wooden Sticks(求长度和重量都严格递增的数列的个数)的相关文章

POJ 3415 Common Substrings (求长度不小于k的公共子串的个数)

Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10002   Accepted: 3302 Description A substring of a string T is defined as: T(i, k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|. Given two strings A, B and one integer K, we define S,

POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)

Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. Given two strings A, B and one integer K, we define S, a set of triples (i, j, k): S = {( i, j, k) | k≥ K, A( i, k)= B( j, k)}. You are to give the val

(hdu step 3.1.5)Tiling_easy version(求用2*1、2*2两种骨格铺满2*n的网格的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Tiling_easy version Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 515 Accepted Submission(s): 447   Prob

(hdu step 4.2.3)Knight Moves(求从起点是否能够到达终点的最小步数)

题目: Knight Moves Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 453 Accepted Submission(s): 326   Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where

(hdu step 5.1.5)Dragon Balls(求并查集的根节点、节点数和个结点的移动次数)

题目: Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 562 Accepted Submission(s): 239   Problem Description Five hundred years later, the number of dragon balls will increase unexpected

(hdu step 7.1.5)Maple trees(求凸包的最小覆盖圆的半径)

题目: Maple trees Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 177 Accepted Submission(s): 63   Problem Description There are a lot of trees in HDU. Kiki want to surround all the trees with the m

(hdu step 5.1.3)Segment set(求与一条线段相交的线段集合中的线段的数量)

题目: Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 177 Accepted Submission(s): 82   Problem Description A segment and all segments which are connected with it compose a segment set. T

hdu acm-step 1.3.6 Wooden Sticks

本题题意:有n根棍子,给出两个属性长度l和重量w,当加工当前棍子的长度和长度均大于上一根棍子时,可以不重置机器,每次重置机器要花1min, 求最小时间. 代码如下: #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct Node { int l,w; bool operator<(const Node &node){if(l<node

(hdu step 3.1.6)统计问题(求不断地左右走、向上走n步的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: 统计问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 732 Accepted Submission(s): 466   Problem Description