ACM ProblemB

来源:互联网 发布:软件开发自学 编辑:程序博客网 时间:2024/06/05 19:15

 我现在做的是编号为1001的试题,具体内容如下:

Problem B

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 226   Accepted Submission(s) : 68
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
213

简单题意:
   排放木棒,每次排放木棒花费1分钟,下一个木棒的长度和重量都比上一个大,否则,则再需要1分钟进行排放木棒。

解题思路:
  要用“贪心算法”,先根据木棒的长度进行升序排列。然后再对重量进行判断,按重量进行分组,把第一个木棒放在第一组,如果第二个木棒的重量比第一个木棒的重量大,则它也是第一组,否则,就把它放在第二组,再往后进行判断,如果这个木棒的重量比第一组中最后一个木棒的重量小,再与第二组的最后一个木棒进行比较,如果比这个大的话就把它放在这个组,否则,就把它放在第三组,以后比较依此类推。

编写代码:

#include <iostream>
#include <algorithm>
using namespace std;
struct stick{
   int length;
   int weight;
 };

 bool cmp(stick a, stick b)
 {
     if (a.length == b.length)
        return a.weight < b.weight;
     else
        return a.length < b.length;
 }
int main()
{
    stick a[5000];
    int b[5000];
    int n;
    cin >> n;
    while (n != 0)
    {
        int t, group;
        cin >> t;
        for (int i=0; i<t; i++)
        {
            cin >> a[i].length >> a[i].weight;
        }
        sort(a, a+t, cmp);
        b[0] = 1;
        for (int i=1; i<t; i++)
        {
            group = 0;
            for (int j=0; j<i; j++)
                if(a[i].weight < a[j].weight && group < b[j])
                   group = b[j];
            b[i] = group + 1;
        }
        int minute = 0;
        for (int i=0; i<t; i++)
            if (b[i] > minute)
                minute = b[i];
        cout << minute << endl;
        n--;
    }
}


 

0 0