蓝桥杯第二次选拔E.Wooden Sticks

/*E.Wooden Sticks
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11619    Accepted Submission(s): 4800


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
 

Source
Asia 2001, Taejon (South Korea)


题目大意  :有n根木条,加工第一根需要1时间,如果后一根的长度和重量都大于等于前一根那么机器不用化费额外的时间
                 现给定n根木条的长度和重量,求出加工这些木条最少需要的时间

题目分析  :采用贪心策略,先对木条的长度或者重量排序,长度排完序后再对重量排序,找到一组重量单调增(减)的集合则做出标记,最后求得的集合的数目即为问题的答案。

*/ 

#include<cstdio>  
#include<algorithm>  
using namespace std;  
int const MAX = 5000 + 5;  
struct STICK                                      //当时就想把l和w的数组连对应起来,但是没想到结构体。要学会用它。  
{  
    int l;  
    int w;  
}sticks[MAX];  
  
int flag[MAX];  
  
bool cmp(const STICK &a,const STICK &b)         //用于快速排序 把结构体以l从 小到大进行排序。 
{  
    if(a.l != b.l)  
        return a.l < b.l;  
    else  
        return a.w < b.w;  
}  
  
int main()  
{  
    int num,min = 0,cases;  
    scanf("%d",&cases);  
    while(cases--)  
    {  
        scanf("%d",&num);  
        for(int i = 0; i < num; i++)  
        {  
            scanf("%d%d",&sticks[i].l,&sticks[i].w);  
            flag[i]=0;                                            //但是我也觉得这是个难点,如何把检测过的结构体不再检测 ,用flag解决。 
        }  
        sort(sticks,sticks + num,cmp);  
        int cnt = 0;                                    //统计w的由小到大排序组的个数,也就是多少分钟。 
        for(int i = 0; i < num; i++)  
        {  
            if( flag[i] )                          //检测过的结构体不再检测 
                continue;  
            min = sticks[i].w;                      //检测w的由小到大排序组。 
            for(int j = i + 1; j < num; j++)  
            {  
                if(min <= sticks[j].w && !flag[j])  
                {  
                    min = sticks[j].w;  
                    flag[j] = 1;  
                }  
            }  
            cnt++;                       //非continue的一个循环节就是一组w从小到大的排序组。 
        }  
        printf("%d\n",cnt);  
    }  
}  
/*
当时也准备这么做,但是觉得这样的结果凭什么就是对的,也没想清楚,就没做了。这里有几个思维难点。
1.为什么要对l(或者w)排好序,再检测w(或者l)有多少排好序的组就是最少的时间?
还是数学思维帮了忙。
eg:模型1:先把l排好序,然后任意调换一个l1,l2的结构体,总时间只能是加一或者不变。
加一是因为对应的w1和w2调换了以后是由大到小 , 不变是因为对应的w1和w2调换了以后正好是由小到大 所以总时间没变。
 模型2:如果本题改成求最大时间,那么 把l或者w从大到小排好序就可以了。时间就是最大时间。
由这两个模型成功解决了难点1.为了让时间最小。就需要先使l或者w排好序。
这也是这题贪心思想的核心。


2.为什么l排好序和w排好序算出的时间是相同的?(田神说相同,而且的确ac,而且我也觉得有点相同的感觉) 
现场做题的时候我以为不相同。
我用点列图(l,w)和(w,l)两种互反函数的图构造了这个模型
但是 任然没解决为什么两个结果一样,而且的确举不出反例。
我用(n,n)的点列来作为初始化模型。再一次一次改变点的位置,有点感觉,但是还没解决。
gg了。 
 
 
*/ 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值