POJ1065/HDOJ1051 Wooden Sticks

                                                                                         Wooden Sticks
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 14809 Accepted: 6081

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 ( 9 , 4 ) , ( 2 , 5 ) , ( 1 , 2 ) , ( 5 , 3 ) , and ( 4 , 1 ) , then the minimum setup time should be 2 minutes since there is a sequence of pairs ( 4 , 1 ) , ( 5 , 3 ) , ( 9 , 4 ) , ( 1 , 2 ) , ( 2 , 5 ) .

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 2n 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

 
 
思路:有一堆棍子,棍子有长度(L)和重量(W)。机器处理第一根棍子花费1秒。如果后一根棍子的长度(L`)和重量(W`)都比前一根的大,则后一根棍子不需要花费时间(L`>=L&&W`>=W)。求怎样处理这一堆棍子,所花费的时间最少。
        本题可以运用贪心策略,首先按照L进行递增排序,如果L相等则按照W递增进行排序(当然也可以把W当做第一关键字,L当做第二关键字)。排序后,从前往后,找出每一根棍子的后继棍子(条件为后一根棍子的L和W都>=前一根的)。最后可以找出都少条这样的链即为所求。
注意:本题表面上看可以依据L*W的递增进行排序,但是,实际上是不行的。反例:(5,2) (4,3) (4,1) (1,3)。如果按照L,W排序为:(1,3),(4,1),(4,3),(5,2)。结果为2。如果按照面积排序为(1,3),(4,1),(5,2),(4,3)。结果为3。
  
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cmath>
  5 #include <cstring>
  6 #include <algorithm>
  7 #include <map>
  8 #define MAXINT 99999999
  9 
 10 #define MININT -1
 11 
 12 using namespace std;
 13 
 14 struct Node{
 15        int l;
 16        int w;
 17        }node[5000+4];
 18        
 19        
 20 int vis[5000+4];
 21 
 22 
 23        
 24 bool cmp(Node x,Node y)
 25 {if(x.l<y.l)
 26  return true;
 27  else if(x.l==y.l)
 28  {if(x.w<=y.w)
 29   return true;
 30  }
 31  return false;
 32 }
 33 
 34 
 35 
 36 
 37 int main()
 38 {
 39     int n;
 40     int m;
 41     int i,j,k;
 42     scanf("%d",&m);
 43     while(m--)
 44     {
 45               scanf("%d",&n);
 46               
 47               for(i=0;i<n;i++)
 48               {
 49                               scanf("%d%d",&node[i].l,&node[i].w);
 50               }
 51               
 52               sort(node,node+n,cmp);
 53               
 54               //for(i=0;i<n;i++)
 55              // cout<<node[i].l<<' '<<node[i].w<<endl;
 56               
 57               for(i=0;i<n;i++)
 58               {vis[i]=0;}
 59               
 60               
 61               int countn=0;
 62               
 63               
 64               for(i=0;i<n;i++)
 65               {
 66                               if(vis[i])
 67                               continue;
 68                               
 69                               vis[i]=1;
 70                               countn++;
 71                               int pre=i;
 72                               for(j=i+1;j<n;j++)
 73                               {
 74                                               
 75                                               
 76                                               
 77                                               
 78                                               if(vis[j]==0)
 79                                               {
 80                                                            if(node[j].w>=node[pre].w)
 81                                                            {vis[j]=1;pre=j;}
 82                                               }
 83                                               
 84                               }
 85               }
 86               
 87               cout<<countn<<endl;
 88     }
 89                                                            
 90                               
 91               
 92               
 93               
 94           
 95            
 96                             
 97     
 98     //system("PAUSE");
 99     
100     return 0;
101 }

 

转载于:https://www.cnblogs.com/zjushuiping/archive/2012/08/08/2628928.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值