E. 零件分组(stick) [ 问题 1800 ] [ 讨论 ]
Description
某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi)。现在为了加工需要,要将它们分成若干组,使每一组的零件都能排成一个长度和重量都不下降(若i<j,则Li≤Lj,Wi≤Wj)的序列。请问至少要分成几组?
Input
第一行为一个整数N(N≤1000),表示零件的个数。第二行有N对正整数,每对正整数表示这些零件的长度和重量,长度和重量均不超过10000。
Output
仅一行,即最少分成的组数。
Samples
Input 复制
5
8 4 3 8 2 3 9 7 3 5
Output
2
思路:
首先按长度将其大致分出一组来,然后对重量进行贪心;
struct ss{
int l,w;
}q[10001];
short judge[10001]={0};这个存的是按重量分组时当前每一组的最后一个棍子的重量,(把每组最后一个棍子的重量标为一其他的为零。
int cmp(ss a,ss b)
{
if(a.l==b.l) return a.w<b.w;
return a.l<b.l;
}
int main() {
int n;
cin>>n;
memset(judge,0,sizeof judge);
for(int i=1;i<=n;i++)
{
cin>>q[i].l>>q[i].w;
}
sort(q+1,q+1+n,cmp);
for(int i=1;i<=n;i++)
{
for(int j=q[i].w;j>=1;j--)
{
if(judge[j]==1)
{
judge[j]=0;
break;
}
}
judge[q[i].w]=1;
}就是从后面一个一个往前赶。
int sum=0;
for(int i=1;i<=10001;i++)
{
if(judge[i]) sum++;前面说了每组的最后一个标一就数一下有几个一就行了。
}
cout<<sum;
return 0;
}