Wooden Sticks(hdu1051排序法的应用)

来源:互联网 发布:mac版vpn哪个好用 编辑:程序博客网 时间:2024/06/08 16:14
/*//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;}


原创粉丝点击