題目描述
某工廠生產一批棍狀零件,每個零件都有一定的長度(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
典型貪心問題,用快排,但我用的是冒泡,算得上是DP,最長不下降子序列。
#include <iostream>
using namespace std;
int a[1005],b[1005],la[1005];
int main()
{
int n,x,y;
int i,j,t,s;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i]>>b[i];
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if((a[i]==a[j]&&b[i]>b[j])||a[i]>a[j])
{
t=a[i];a[i]=a[j];a[j]=t;
t=b[i];b[i]=b[j];b[j]=t;
}
s=1;
la[s]=b[1];
for(i=2;i<=n;i++)
{
x=0;
y=-1;
for(j=1;j<=s;j++)
if(la[j]>x&&la[j]<=b[i])
{
x=la[j];
y=j;
}
if(y==-1)
{
s++;
la[s]=b[i];
}
else
la[y]=b[i];
}
cout<<s;
return 0;
}