HDU1051Wooden Sticks(贪心)

题目:有一堆n个木棍。每个棒的长度和重量是预先已知的。枝要处理的一种时尚于一体的木工机器。这需要一定的时间,被称为建立时间,机器准备处理棍子。设置时间相关的清洁操作和不断变化的工具和机器的形状。木工机的设置时间如下:(一)第一木棍设置时间为1分钟。(二)右后加工一棒的长度l和权重w,机器将不再需要设置时间一根长度l'和重量W'L <= W <= W'。否则,将需要设置为1分钟。你要找到最小建立时间处理给定的n个木棍桩。例如,如果你有五个枝的长度和重量的对是(4,9),(5,2),(2,1),(3,5),(1,4),则最小的建立由于是一个序列的对(1,4),(3,5),(4,9),(2,1),(5,2),时间为2分钟。

原题:http://acm.hdu.edu.cn/showproblem.php?pid=1051

题解:此题与HDU1050解题方法相同,但不可以用1050的第一种方法,因为n太大;所以就是先排序,然后在计算可以放在同一排的树枝;

代码实现:

#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define MAX   5005
struct line1
{
     int s,e;
}line[MAX];
int sign[MAX];//存储可以排在一排的最大树枝的宽度;
bool cmp(line1 x,line1 y)
{
     if(x.s==y.s)
          return(x.e<y.e);
     return(x.s<y.s);
}
int main()
{
   //freopen("input.txt","r",stdin);
   int i,j,t,n;
   scanf("%d",&t);
   while(t--)
   {
        scanf("%d",&n);
        memset(sign,-1,sizeof(sign));
        for(i=0;i<n;i++)
        {
             scanf("%d%d",&line[i].s,&line[i].e);
        }
        sort(line,line+n,cmp);
        int flag=0;
        for( i=0;i<n;i++)
        {
             for(j=0;j<=n;j++)
             {
                  if(line[i].e>=sign[j])//因为长度已经按从小到大排过序了,所以就不用管它了,只需把一排中最大宽度存储在数组中;
                  {
                       sign[j]=line[i].e;
                       if(j+1>flag)flag=j+1;
                       break;//一旦找到就跳出循环;
                  }
             }
        }
        printf("%d\n",flag);
   }
   return 0;
}


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