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