【HDOJ1051】【排序+LIS】【贪心】

it2022-05-05  130

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

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

转载于:https://www.cnblogs.com/MekakuCityActor/p/9195239.html

相关资源:各显卡算力对照表!

最新回复(0)