HDU 1051 Wooden Sticks(贪心)

Wooden Sticks

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)


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
 
/************************************************************************/

题意:现有n跟木棍需要进行加工,告诉你每根木棍的长度l和重量w,并告知你加工第一根木棍需要1分钟的准备时间,而若接下来加工的木棍(长度为l',重量为w')如果l'>=l&&w'>=w的话,这根木棍不需要准备时间,否则,仍需要1分钟的准备时间,问为了使得需要准备的时间最短,你要合理安排加工木棍的顺序,最终给出最短的准备时间是多少即可

解题思路:该题考查的就是贪心的思想,只要每次你加工的木棍的长度l'与重量w'满足题目条件的情况下做到最接近就可以了,不需要担心满足了长度不满足重量或满足了重量不满足长度的情况,因为按照这种做法必定是最优解,不信可以试着自己举举例子

比如

5 3

2 6

3 3

2 4

4 2

1 1

①我们可以按照长度优先,重量次之来取

可以这样分组

1 1->2 4->2 6一组

3 3->5 3一组

4 2一组

共三组,需要3分钟准备时间

②我们按照重量优先,长度次之来取

可以这样分组

1 1->4 2->5 3一组

3 3一组

2 4->2 6一组

同样也是三组,需要3分钟准备时间

由上可知,虽然你安排的方案略有不同,但是只要是同一种原理,结果是一样的,即准备时间必定相等

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 5005;
const int inf = 1000000000;
const int mod = 258280327;
struct group
{
    int x,y;
}s[N];
bool cmp(group x,group y)
{
    if(x.x!=y.x)
        return x.x<y.x;
    return x.y<y.y;
}
bool v[N];
int main()
{
    int t,n,i,j,ans,l,w;
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        memset(v,false,sizeof(v));
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d%d",&s[i].x,&s[i].y);
        sort(s,s+n,cmp);
        for(i=0;i<n;i++)
            if(!v[i])
            {
                l=s[i].x,w=s[i].y;
                for(j=0;j<n;j++)
                    if(!v[j]&&s[j].x>=l&&s[j].y>=w)
                        l=s[j].x,w=s[j].y,v[j]=true;
                ans++;
            }
        printf("%d\n",ans);
    }
    return 0;
}
菜鸟成长记


你可能感兴趣的:(ACM,贪心)