HDU-1051 Wooden Sticks
一 题意描述:
Wooden Sticks
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3902 Accepted Submission(s): 1621
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).
(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
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
1
3
二 思路分析:
本题考察贪心算法的运用,我们可以把数据按照长度从小到大的顺序排序,如果长度相等那么就按照质量从小到大的顺序排序。我们在采用两个for循环进行搜索的时候建议用一个标志数组,如果已经被访问直接跳过。
三 代码展示:
1 #include <iostream> 2 #include <algorithm> 3 #include<iomanip> 4 #include<string.h> 5 using namespace std; 6 #define maxn 5005 7 struct stick 8 { 9 int len,weight; 10 }st[maxn]; 11 int judge[maxn]; 12 int cmp(stick a,stick b) 13 { 14 if(a.len!=b.len) return a.len<b.len;//如果长度不等按照长度排序 15 else 16 { 17 return a.weight<b.weight;//如果长度相同按照质量大小排序 18 } 19 } 20 int main() 21 { 22 int t; 23 cin>>t; 24 while(t--) 25 { 26 int n; 27 cin>>n; 28 int total=0; 29 for(int i=0;i<n;i++) 30 cin>>st[i].len>>st[i].weight; 31 sort(st,st+n,cmp);//对结构体数组进行排序 32 memset(judge,0,sizeof(judge));//标志数组置为0 33 for(int i=0;i<n;i++) 34 { 35 if(judge[i]) continue; 36 int min=st[i].weight; 37 for(int j=i+1;j<n;j++) 38 { 39 if(st[j].weight>=min&&judge[j]==0)//质量比起始值大并且未被访问过 40 { 41 judge[j]=1;min=st[j].weight;//往后搜寻注意及时更新min的值。 42 } 43 } 44 total++; 45 } 46 cout<<total<<endl; 47 } 48 return 0; 49 }