• 【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

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

  • 相关阅读:
    Python数据库 4.Python与数据库的交互
    Python数据库 3.MongoDB(区分大小写)
    Python数据库2.Redis数据库
    Python数据库1. 数据库简介
    Python基础 12.常用模块
    Python基础 11.Vim使用
    Python基础 10.linux基本命令
    栈理解
    java集合Collection
    斐波那契函数
  • 原文地址:https://www.cnblogs.com/MekakuCityActor/p/9195239.html
Copyright © 2020-2023  润新知