zoukankan      html  css  js  c++  java
  • 贪心-Wooden Sticks

    先将火柴按照长度(或重量)优先排序,在不断遍历数组,找出其中重量(长度)递增子序列,并标记


    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
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct wood{
        int l;
        int w;
        int flag;
    }W[5000];
    bool cmp(wood w1, wood w2){
        if(w1.l<w2.l )
        return true;
        else if(w1.l==w2.l && w1.w<=w2.w)
        return true;
        return false;
    }
    int main()
    {
        int t,n;
        cin>>t;
        while(t--){
            cin>>n;
            for(int i=0;i<n;i++){
                cin>>W[i].l>>W[i].w;
                W[i].flag=0;
            }
            sort(W,W+n,cmp);
            //for(int i=0;i<n;i++)
            //cout<<W[i].l<<" "<<W[i].w<<endl;
            int tw;
            int result=0;
            for(int i=0;i<n;i++){
                if(W[i].flag)
                continue;
                tw=W[i].w;
                W[i].flag=1;
                for(int j=0;j<n;j++){
                    if(W[j].flag)
                    continue;
                    if(W[j].w>=tw){
                        tw=W[j].w;
                        W[j].flag=1;
                    }
                }
                result++;
            }
            cout<<result<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    广播接收者的生命周期?
    如何让自己的广播只让指定的 app 接收?
    在 manifest 和代码中如何注册和使用 BroadcastReceiver?
    请描述一下 BroadcastReceiver?
    说说 Activity、Intent、Service 是什么关系
    什么是IntentService?有何优点?
    Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?
    Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?
    两个 Activity 之间跳转时必然会执行的是哪几个方法?
    如何保存 Activity 的状态?
  • 原文地址:https://www.cnblogs.com/zuoyou151/p/10572348.html
Copyright © 2011-2022 走看看