【题解】零件分组

题目描述

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

参考程序

原文地址:https://www.cnblogs.com/kcn999/p/10799578.html

时间: 2024-11-01 15:04:35

【题解】零件分组的相关文章

codevs 4888 零件分组

4888 零件分组 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 现有一些棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将他们分成若干组,使每一组中的零件都能排成一个长度和重量都不下降(若i<j,则Li<=Lj,Wi<=Wj,其中i,j为在同一组中的序号)的序列.请问至少要分成几组? 输入描述 Input Description 第1行为一个整数n,表示棍状零件的总个数.

零件分组_DP

问题 C: 零件分组 时间限制: 1 Sec  内存限制: 64 MB提交: 31  解决: 14[提交][状态][讨论版] 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将它们分成若干组,使每一组的零件都能排成一个长度和重量都不下降(若 i<j,则 Li<=Lj,Wi<=Wj)的序列.请问至少要分成几组? 输入 第一行为一个整数 N(N<=1000),表示零件的个数.第二行有 N 对正整数,每对正整数表示这些零件的长度和重量,

零件分组

数组开小点! 数组开小点! 数组开小点! 不然会MLE.想去打出题人,不知道地址.有的大佬用DP,蒟蒻只会用sort排一遍,然后去看是否满足要求.... 方程: dp[i]=max(dp[j]+1,dp[i]). 代码: #include<bits/stdc++.h> using namespace std; struct str { int l,r; }a[11000]; int n; int dp[11000]={0},ans; bool cmp(str x,str y) { if(x.l

HDU 1712 ACboy needs your help(分组背包)

题意:给你n的课程组,每个课程组有m个课程,每个课程有一个完成时间与价值.问在m天内每组课程组最多选择一个,这样可以得到的最大价值是多少 题解:分组背包,其实就是每个课程组进行01背包,再在课程组内部进行枚举课程,但是这儿必须将枚举课程放在最里层才能保证最多选择一个 #include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<vec

HDU 4341 分组背包

B - Gold miner Time Limit:2000MS Memory Limit:32768KB     Description Homelesser likes playing Gold miners in class. He has to pay much attention to the teacher to avoid being noticed. So he always lose the game. After losing many times, he wants you

【UOJ #46】 【清华集训2014】玄学

题目描述 巨酱有 n 副耳机,他把它们摆成了一列,并且由 1 到n依次编号.每个耳机有一个玄学值,反映了各自的一些不可名状的独特性能.玄学值都是 0 到 m-1 间的整数.在外界的作用下(包括但不限于换线.上放.更换电源为核电.让kAc叔叔给它们讲故事),这些耳机的玄学值会发生改变.特别地,巨酱观察发现,每种作用 o 对应了两个整数 ao与 bo,在这种作用之后,玄学值原本为 x 的耳机,其玄学值恰会变成 (aox+bo)modm. 巨酱对他手头耳机的表现并不满意,遗憾的是,最近他并不有钱,无法

k-means和iosdata聚类算法在生活案例中的运用

引言:聚类是将数据分成类或者簇的过程,从而使同簇的对象之间具有很高的相似度,而不同的簇的对象相似度则存在差异.聚类技术是一种迭代重定位技术,在我们的生活中也得到了广泛的运用,比如:零件分组.数据评价.数据分析等很多方面:具体的比如对市场分析人员而言,聚类可以帮助市场分析人员从消费者数据库中分出不同的消费群体来,并且可以分析出每一类消费者的消费习惯等,从而帮助市场人员对销售做出更好的决策. 所以,本篇博客主要是对生活中的案例,运用k-means算法和isodata聚类算法进行数据评价和分析.本文是

【题解】纪念品分组

题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入格式 n+2行: 第一行包括一个整数w,为每组纪念品价格之和的上限: 第二行为一个整数n,表示购来的纪念品的总件数: 第三

零件加工 贪心 题解

1019: B06-贪心-零件加工[提高组] 时间限制: 1 Sec  内存限制: 128 MB提交: 24  解决: 7[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 工匠小K最近有n个零件需要加工.每个零件都需要ti天的时间来完成,每个零件每延迟一天加工都要缴纳一定的罚金si.延迟的天数为从今天算起到该工作开始的那天,第一个零件加工没有罚金.现在小K想知道怎样安排加工顺序可以使他要交的罚金最少,最少是多少.       这个数可能会很大,请输出这个数对m取模后的结果. 输入