题目:有一堆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;
}