【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).
 
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 }
View Code

(貌似导弹拦截那题大多数人也是使用贪心..(> _ <)

posted @ 2018-06-18 15:00  MekakuCityActor  阅读(175)  评论(0编辑  收藏  举报