题意:
加工木的机械来加工木棍,对于给出的一系列长度和重量已知的木棍,满足如下两个条件约束
(1) 对于第一根长度为L,重量为W的木棍,我们需要1分钟的时间进行安装。
(2) 对于此后的每根长度>=L && 重量>=W的木棍,我们的机械将不再消耗安装时间。
策略:
贪心算法—先排序—后选择第一个没有用过的木头一次向后找,用掉所有可以用掉的木头,然后返回第一个没用过的木头继续找
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
// 结构体保存木头
struct moodG {
int len; // 长度
int heavy; // 重量
int valid; // 是否安装
}mood[5001];
// 按长度优先 其次重量 的标准进行升序排序 (也可以用 重量优先 长度其次的标准)
bool cmp(moodG m1,moodG m2) {
return m1.len < m2.len ? 1 : (m1.len > m2.len) ? 0 : (m1.heavy<m2.heavy);
// return (m1.heavy<m2.heavy) ? 1 : (m1.heavy>m2.heavy) ? 0 : (m1.len<m2.len);
}
int main() {
int cas,n,i,j,k,t,tmp;
scanf("%d",&cas);
for(i=0; i<cas; i++) {
scanf("%d",&n);
t = 0;
for(j=0; j<n; j++) {
scanf("%d%d",&mood[j].len,&mood[j].heavy);
mood[j].valid = 0; // 初始化
}
sort(mood, mood+n, cmp); // 排序
for(j=0; j<n; j++) {
// 找到第一根需要1分钟安装的木头
if(!mood[j].valid) {
mood[j].valid = 1;
t++;
tmp = j;
// 对此后每根长度>=L 宽度>=W的木头
for(k=j+1; k<n; k++) {
if(!mood[k].valid && mood[tmp].len<=mood[k].len && mood[tmp].heavy<=mood[k].heavy) {
mood[k].valid = 1;
tmp = k;
}
}
}
}
printf("%d\n",t);
}
return 0;
}