POJ1065(Wooden Sticks)

http://poj.org/problem?id=1065

我发现我真的不适合做这些问题,老是考虑不完全。看到题之后,我知道要先排序,因为最省时的是l'>l,w'>w,

排序之后就可以只看weight了,所以先将lenth作为一级参数,weight作为二级参数排序。排序之后就只需要考虑

weight这个方面了。然后开始处理stick,对处理过的stick标记为1,剩下再循环处理,每次开始新的循环时间都

要+1,直到所有的stick都处理完毕。我自己给代码的注释还是蛮给力的.

贴下我的代码:

 

#include<stdio.h>
#include<stdlib.h>
#define N 5005

typedef struct stick
{
int l,w;
}R;

R st[N];
int mark[N]; //标记函数,用于判断st的第i项是否被处理

/* 进行长度从小到大的排序,长度相等时看重量*/
int cmp(const void *_p,const void *_q)
{
R *p = (R *)_p;
R *q = (R *)_q;
if(p->l == q->l) return p->w - q->w;
return p->l - q->l;
}

int main()
{
int T,n,i,j,t,cnt;
scanf("%d",&T);
while(T --)
{
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%d%d",&st[i].l,&st[i].w); //排序
qsort(st,n,sizeof(st[0]),cmp);
memset(mark,0,sizeof(mark));
cnt = t = 0;
while(cnt != n) //cnt用于计数当其与n相等就处理完了所有stick
{
/*未被处理的要时间+1处理*/
for(i = 0; i < n; i++)
if(!mark[i]) {
j = i; t++; break;
}
/*循环处理未被处理的且符合要求的stick*/
for(i = 0; i < n; i++)
{
if(!mark[i] && st[i].w >= st[j].w)
{
mark[i] = 1;
cnt++;
j = i; //将能处理的重量st[j].w增大
}
}
}
printf("%d\n",t);
}
return 0;
}


 

你可能感兴趣的:(poj)