【HDOJ1051】【排序+LIS】【贪心】
http://acm.hdu.edu.cn/showproblem.php?pid=1051
Wooden Sticks
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24757 Accepted Submission(s): 9973
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
Sample Output
2
1
3
题目大意:
有一堆n个木棍,长度质量已知,机器处理木棍需要设置时间,规定
(1)第一根木棍的设置时间是1min
(2)前一个处理的木棍长度和质量小于等于后一个就不用设置时间,否则需要1min设置
找到最小建立时间。
如 给出(4,9)(5,2)(2,1)(3,5)(1,4)则最小建立时间(1,4)(3,5)(4,9)(2,1)(5,2)。
(本来想找个贪心的水题耍一下..结果发现完全看不出这道题的贪心解法...然后想到之前做的一个导弹拦截的问题..感觉二者有异曲同工之妙..
题目分析:首先按照长度进行排序..长度相同的按照重量排序..然后就能直接取了??(假的贪心..很容易找到hack数据..我的做法是在排序之后..从后往前找到这段数字的最长上升子序列的长度K,..则.K就是答案..这一点和导弹拦截的那题几乎一致。
导弹拦截http://acm.hdu.edu.cn/showproblem.php?pid=1257
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 struct pot{ 6 int len; 7 int weig; 8 }qwq[5005]; 9 bool cmp(struct pot aa,struct pot bb){ 10 if(aa.len!=bb.len) 11 return aa.len < bb.len; 12 return aa.weig < bb.weig; 13 } 14 int main() 15 { 16 int nums[405]; 17 int t; 18 scanf("%d",&t); 19 while(t--){ 20 int n; 21 scanf("%d",&n); 22 memset(nums,0,sizeof(nums)); 23 for(int i = 0 ; i < n; i++){ 24 scanf("%d%d",&qwq[i].len,&qwq[i].weig); 25 } 26 sort(qwq,qwq+n,cmp); 27 int dp[5005]; 28 int tot=1; 29 dp[1]=qwq[n-1].weig; 30 int maxx=qwq[n-1].weig; 31 for(int i = n-2 ; i >= 0 ; i--){ 32 if(qwq[i].weig>dp[tot]){ 33 dp[++tot]=qwq[i].weig; 34 maxx=dp[tot]; 35 } 36 else{ 37 int l=1; 38 int r=tot; 39 while(l<=r){ 40 int mid=(l+r)/2; 41 if(dp[mid]>=qwq[i].weig){ 42 r=mid-1; 43 } 44 else { 45 l=mid+1; 46 } 47 48 } 49 dp[l]=qwq[i].weig; 50 } 51 } 52 cout << tot <<endl; 53 } 54 return 0; 55 }
(貌似导弹拦截那题大多数人也是使用贪心..(> _ <)