题解零件分组

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解零件分组相关的知识,希望对你有一定的参考价值。

题目描述

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

 

以上是关于题解零件分组的主要内容,如果未能解决你的问题,请参考以下文章

零件分组

零件分组_DP

零件加工 贪心 题解

题解 P5663 加工零件民间数据

Python分组;仅在满足条件时保留

如何根据不同的分组条件得到两个数量列的总和?