题目描述
某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi)。现在为了加工需要,要将它们分成若干组,使每一组的零件都能排成一个长度和重量都不下降(若 i<j,则 Li<=Lj,Wi<=Wj)的序列。请问至少要分成几组?
输入
第一行为一个整数 N(N<=1000),表示零件的个数。第二行有 N 对正整数,每对正整数表示这些零件的长度和重量,长度和重量均不超过 10000。
输出
仅一行,即最少分成的组数。
样例输入
5
8 4 3 8 2 3 9 7 3 5
样例输出
2
一开始我定义了一个结构体来存长度和重量,然后进行排序,然后遍历一遍,如果mp[i+1].w<mp[i].w ans++;结果不对。后来明白不能这样简单的做,因为分组不一定是按排列好的顺序来分的。最后参考了一下别人的题解,明白了可以先排序,然后求重量的最长递减序列的长度,求得的长度即为答案。

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct node 5 { 6 int l,w; 7 }mp[1005]; 8 bool cmp(node x,node y) 9 { 10 if(x.l==y.l) return x.w<y.w; 11 return x.l<y.l; 12 } 13 char ch; 14 int n,x,len,ans,p,a[50005]; 15 string s; 16 bool flag; 17 int main() 18 { 19 // freopen("in.txt","r",stdin); 20 cin>>n; 21 for(int i=0;i<n;i++) 22 cin>>mp[i].l>>mp[i].w; 23 sort(mp,mp+n,cmp); 24 a[0]=mp[0].w; 25 len=0; 26 int flag; 27 for(int i=1;i<n;i++) 28 { 29 flag=0; 30 for(int j=0;j<len;j++) 31 { 32 if(a[j]<=mp[i].w) 33 { 34 a[j]=mp[i].w; 35 flag=1; 36 break; 37 } 38 } 39 if(!flag) a[len++]=mp[i].w; 40 } 41 cout<<len<<endl; 42 return 0; 43 }