POJ 1065 && HDU 1051 Wooden Sticks(贪心)

Description
有一些木材和一台机器。机器每次加工一根木材需要的时间是1,但是当加工木材的长度和宽度都小于等于前一根木材的时候,不需要时间。求最少需要多少时间加工完所有的木材
Input
第一行为数据组数t,每组用例第一行为木材数量n,然后是每根木材的长度和宽度
Output
对于每组用例,输出最短加工时间
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
Solution
由于切一根最长最宽的就可以不切比它短和窄的,反过来就是切一根最短最细的就不用切比它长和宽的,所以将木材升序排之后,从最短的开始切,用标记数组表示是否切此根木材,每切一根就把比它长和宽的标记,最后记录没被标记的木材即为需要切的木材数量
Code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 5050
struct node
{
    int len,wid;
}wood[maxn];
int cmp(node a,node b)
{
    if(a.len==b.len)
        return a.wid<b.wid;
    return a.len<b.len;
}
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d%d",&wood[i].len,&wood[i].wid);
        sort(wood,wood+n,cmp);//对木材排序 
        bool flag[maxn];//标记数组,0为切,1为不切 
        memset(flag,false,sizeof(flag));//初始化所有木材都切 
        for(int i=0;i<n;i++)
        {
            if(flag[i])//已经不用切了 
                continue;
            int temp=i;//切这个木材 
            for(int j=i+1;j<n;j++)//比被切的长和宽就不切了 
                if(!flag[j]&&wood[j].len>=wood[temp].len&&wood[j].wid>=wood[temp].wid)
                {
                    flag[j]=1;
                    temp=j;
                }
        }
        int ans=0;
        for(int i=0;i<n;i++)
            if(!flag[i])
                ans++;
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(POJ 1065 && HDU 1051 Wooden Sticks(贪心))