Wooden Sticks

来源:互联网 发布:数据对比分析的方法 编辑:程序博客网 时间:2024/06/04 01:11
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<cstdio>#include<algorithm>#include<cstring>using namespace std;struct student{    int length;    int weight;}STU[5200],STU1[5200];bool comp(struct student a,struct student b){    if(a.length<b.length)        return true;    else    {        if(a.length==b.length)        {            if(a.weight<b.weight)                return true;            else                return false;        }        else            return false;    }}int main(){    int i,n,j,k,t,sum,z;    scanf("%d",&n);    while(n)    {        scanf("%d",&z);        for(i=0;i<z;i++)            scanf("%d %d",&STU[i].length,&STU[i].weight);        sort(STU,STU+z,comp);        for(i=0,t=0,sum=1;i<z;i++)        {            if((STU[i].length==-1)&&(STU[i].weight==-1))                continue;            STU1[t].length=STU[i].length,STU1[t].weight=STU[i].weight,t++;            STU[i].length=-1,STU[i].weight=-1;            for(j=i+1;j<z;j++)            {                if((STU[j].length==-1)&&(STU[j].weight==-1))                    continue;                if((STU[j].length>=STU1[t-1].length)&&(STU[j].weight>=STU1[t-1].weight))                {                    STU1[t].length=STU[j].length,STU1[t].weight=STU[j].weight,t++;                    STU[j].length=-1,STU[j].weight=-1;                }                else                    continue;            }        }        for(i=0,sum=1;i<t-1;i++)        {            if((STU1[i].length<=STU1[i+1].length)&&(STU1[i].weight<=STU1[i+1].weight))                continue;            else                sum++;        }        printf("%d\n",sum);        n--;    }    return 0;}

原创粉丝点击