练习1-b

编号: 1001 Problem B

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

题意 :  加工木头,木头有长度和重量之分,每一次加工木头需要1分钟时间进行准备,如果下一次加工的木头的长度和重量均大于上次加工的木头的长度和重量,则不需要时间进行准备。求加工所有木头所需的最短时间。


思路:第一次想着写一个排序函数,直接按照最优解的加工顺序把各组数据排列出来,结果证明是我错了,后来又咨询

了一下远飞,才知道这题的做法个上一题是非常相似的,还是用安排活动的算法进行解题,木头的长度和重量相当于活动的起始和终止时间,对长度进行升序排列后,然后对重量进行多次的筛选,然后就可得出结果。


感想:在做完第一题后,对贪心算法的理解加深了不少,然后这一题做起来就容易多了。然后第三题做起来就不是那么容易了,加油!


代码:

# include <iostream>
# include <vector>
# include <algorithm>
# include <fstream>

using namespace std;

struct wooden
{
    int l;
    int w;
    int nu;
    bool operator < (const wooden &a) const
    {
            return l <= a.l ;
    }
};

int main()
{
    //ifstream cin ("b.txt");
    vector<wooden> wo;
    wooden wwo;
    int n;
    cin >> n;
    while(n--)
    {
        wo.clear();
        int m;
        cin >> m;
        while (m--)
        {
            cin >> wwo.l >> wwo.w;
            wo.push_back(wwo);
        }
        sort (wo.begin(), wo.end());
        //for (int i = 0; i < wo.size(); i++)
           // cout << wo[i].l <<" " << wo[i].w<<endl;
        int time = 0;
        for (int i = 0; i < wo.size(); i++)
        {
            if (wo[i].nu == 0)
                continue;
            time ++;
            int count = i;
            wo[i].nu = 0;
            for (int j = 0; j < wo.size(); j++)
            {
                if (wo[count].w <= wo[j].w && wo[j].nu != 0)
                {
                    wo[j].nu = 0;
                    count = j;
                }
            }
        }
        cout << time <<endl;
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值