• 贪心算法之木棍的加工


    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
    

    好烦啊。。。
    其他的题也有类似的情况,样例能过但是提交错误。。。
    但是这个实在看不出,数组开的刚好够大,也尝试分组输出和同时输出,为什么就不能过呢。。。确实一开始写的有点问题,木棍的长度和重量必须同时满足条件才可以,但是。。。
    两类代码(WA):
    一、

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    int c[5001];
    using namespace std;
    struct wooden
    {
    
        int l,w;
    
    };
    wooden my[5010];
    bool comp(wooden a,wooden b)
    {
        if(a.l>b.l)
            return 1;
        else if(a.l==b.l)
            return a.w>b.w;
        else
            return 0;
    }
    int main()
    {
        int t;
        cin>>t;
        int x=1;
        while(t--)
        {
            int n;
            cin>>n;
            int i=0,j;
            while(i<n)
                cin>>my[i++].l>>my[i].w;
            sort(my,my+n,comp);
            int out=n;
            for(i=1; i<n; i++)
                for(j=0; j<=i-1; j++)
                {
                    if(my[j].l>=my[i].l&&my[j].w>=my[i].w)
                    {
                        out--;
                        my[j].l=my[i].l;
                        my[j].w=my[i].w;
                        my[i].l=0;
                        my[i].w=0;
                        break;
                    }
                }
                c[x]=out;
                x++;
        }
        for(int i=1;i<x;i++)
            cout<<c[i]<<endl;
        return 0;
    }
    

    二、

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    struct wooden
    {
    
        int l,w;
    
    };
    wooden my[5010];
    bool comp(wooden a,wooden b)
    {
        if(a.l>b.l)
            return 1;
        else if(a.l==b.l)
            return a.w>b.w;
        else
            return 0;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            int i=0,j;
            while(i<n)
                cin>>my[i++].l>>my[i].w;
            sort(my,my+n,comp);
            int out=n;
            for(i=1; i<n; i++)
                for(j=0; j<=i-1; j++)
                {
                    if(my[j].l>=my[i].l&&my[j].w>=my[i].w)
                    {
                        out--;
                        my[j].l=my[i].l;
                        my[j].w=my[i].w;
                        my[i].l=0;
                        my[i].w=0;
                        break;
                    }
                }
            cout<<out<<endl;
        }
        return 0;
    }
    
    
  • 相关阅读:
    ZOJ 3490 String Successor
    ZOJ 3465 The Hive
    ZOJ 3077 Move to Baggage Office
    ZOJ 2836 Number Puzzle
    POJ 2115 C Looooops
    ZOJ 3605 Find the Marble
    扩展欧几里德
    搭配飞行员(网络流)
    最小费用流
    最大流
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/12130036.html
Copyright © 2020-2023  润新知