P2093 零件分組

題目描述

某工廠生產一批棍狀零件,每個零件都有一定的長度(Li)和重量(Wi)。現在爲了加工需要,要將它們分成若干組,使每一組的零件都能排成一個長度和重量都不下降(若i<j,則Li<=Lj,Wi<=Wj)的序列。請問至少要分成幾組?

輸入輸出格式

輸入格式:

第一行爲一個整數N(N<=1000),表示零件的個數。第二行有N對正整數,每對正整數表示這些零件的長度和重量,長度和重量均不超過10000。

輸出格式:

僅一行,即最少分成的組數。

輸入輸出樣例

輸入樣例#1:
5
8 4 3 8 2 3 9 7 3 5
輸出樣例#1:
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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章