C

前端之家收集整理的这篇文章主要介绍了C前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

description

有N个木棍,长度和宽度已知。现在要一个接一个的拼接木棍。当然我们需要计算总共拼接的时间。有以下规则:
对于第一根处理的木棍,我们需要1分钟。
之后处理的木棍,如果说他的长度l和宽度w满足l0<=l并且w0<=w,那么我们不需要额外再花费时间去拼接。
比如,对于(9,4),(2,5),(1,2),(5,3),(4,1)这5根木棍,我们需要花费最少2分钟的时间:(4,1),(9,4)和(1,5)。

input

输入有多组数据,每组数据第一行为一个整数n,(1<=n<=5000),然后第二行有2n个整数,分别为(l1,w1),(l2,w2)……每个数最大不超过10000

output

输出一个数sum,为最小的花费时间

sample_input

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

以l为第一关键字、w为第二关键字非降序排序,统计单调递增子序列的数量即可。
注意OJ网站中是否允许使用自带qsort函数,如果不允许你自己写一个就行


#include

struct g
{
int l;
int w;
bool tag;
}sticks[2505];

int cmp(const void a,const void b)
{
struct g c=(g )a;
struct g d=(g )b;
if(c->l!=d->l)
return c->l-d->l;
else
return c->w-d->w;
}

int main()
{
int i,j,n;
int ans,temp;
scanf("%d",&n);
for(i=0;i<n;i++)
{
sticks[i].tag=false;
scanf("%d%d",&sticks[i].l,&sticks[i].w);
}
qsort(sticks,n,sizeof(sticks[0]),cmp);
ans=0;
for(i=0;i<n;i++)
{
if(sticks[i].tag==false)
{
ans++;
temp=sticks[i].w;
sticks[i].tag=true;
for(j=i+1;j<n;j++)
{
if(sticks[j].tag==false&&sticks[j].w>=temp)
{
sticks[j].tag=true;
temp=sticks[j].w;
}
}
}
}
printf("%d\n",ans);
return 0;
}

猜你在找的程序笔记相关文章