【题解】零件分组

题目描述

        某工厂生产一批棍状零件,每个零件都有一定的长度(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

 

题解

         我们按照一个关键字排序,然后枚举当前的最长不下降子序列即可。具体看代码。

#include <iostream>
#include <algorithm>
#define MAXN 1001

using namespace std;

int n;
struct node
{
    int v;
    int w;
}a[MAXN];
int ans;

bool cmp(node a, node b)
{
    if(a.v != b.v) return a.v < b.v;
    return a.w < b.w; 
}

int main()
{
    cin >> n;
    for(register int i = 1; i <= n; i++)
    {
        cin >> a[i].v >> a[i].w;
    }
    sort(a + 1, a + 1 + n, cmp);//价值重量升序 
    int flag = n;//剩下的零件数量 
    while(flag)
    {
        ans++;//一组 
        for(register int l = 1, r = 2; r <= n; r++)
        {
            if(a[l].v == -1)
            {
                l++;//使用过 
                continue;
            }
            if(a[l].v <= a[r].v && a[l].w <= a[r].w)
            {
                a[l].v = -1;
                a[l].w = -1;
                flag--;
                l = r;
                if(r == n)
                {//特判 
                    a[r].v = -1;
                    a[r].w = -1;
                    flag--;
                }
            } 
            else
            {
                if(r == n)
                {//特判 
                    a[l].v = -1;
                    a[l].w = -1;
                    flag--;
                }
            }
        }
    }
    cout << ans;
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10799578.html