Wooden Sticks(hdu1051排序法的应用)

/*//http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22157#problem/F   
http://acm.hdu.edu.cn/showproblem.php?pid=1051
Wooden Sticks


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8411    Accepted Submission(s): 3428




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


4 9 5 2 2 1 3 5 1 4 

2 2 1 1 2 2 

1 3 2 2 3 1
 


Sample Output
2
1
3
 


Source
Asia 2001, Taejon (South Korea)
 题意:
 给出一系列木棍的长度和重量,第一根木棍进行操作用时1minute,当满足第j根木棍满足li<=lj&&wi<=wj时操作时间为零,否则为1
 将所有的木棍进行操作,求最少需要的时间 
 思路:排序法得的应用,以棍长短的优先
        然后从最短的那根可以一一历遍(这里即将已满足条件的木棍要进行标记,以省时),并且记录时间
*/
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include <iostream>
using namespace std;
const int maxn=5000+10;
int vis[maxn];
struct sticks
{
   int L;
   int W;
}st[maxn];
int cmp(sticks s1,sticks s2)


 {
   return (s1.L<s2.L||(s1.L==s2.L&&s1.W<=s2.W));
 }
int main()
 {
int T,n,k;
 int i,j,ans,t;
 scanf("%d",&T);
 while(T--)
  {           memset(vis,0,sizeof(vis));
             scanf("%d",&n);
           for(i=0;i<n;i++)
           {scanf("%d%d",&st[i].L,&st[i].W);
           }
           sort(st,st+n,cmp);//以短的木棍为优先,排序
           ans=n;
           k=0;
           for(i=0;i<n;i++)//从当前最短的木棍可以寻找
           {   j=i;
               if(!vis[j])//如果该木棍未被操作
               {         t=j+1;
                      while(t<n)
                      {
                      if(!vis[t])
                      if(st[j].L<=st[t].L&&st[j].W<=st[t].W)//如果该木棍可操作,则继续寻找,并加以标记
                        {
                         vis[t]=1;
                         ans--;
                         k++;
                         j=t;
                        }
                        t++;
                      }
               }




           }
           //printf("k=%d",k);


  //for(i=0;i<n;i++)
  // printf("(%d,%d) ",st[i].L,st[i].W);
   printf("%d\n",ans);
  }
  //system("pause");
  return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值