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