题目大意:给一些高度不同的商品,要放在一些高度固定相同的箱子里,商品与箱子宽度相同,且每个箱子最多放两个商品,问最少要用多少个箱子。
解题思路:将商品按高度排序,最大与最小的配对,若小于等于箱子高度,则放进箱子,置为 0,箱子数 +1,若大于则不管,最后一个循环查找剩下不能配对的商品单独放进箱子,找到一个箱子 +1。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctype.h>
using namespace std;
int str[100010];
int cmp(const void*a, const void*b) {
return *(int*)b - *(int*)a;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
memset(str, 0,sizeof(str));
int n, l, cnt = 0;
scanf("%d%d", &n, &l);
for (int i = 0; i < n; i++) {
scanf("%d", &str[i]);
if (str[i] == l) {
str[i] = 0;
cnt++;
}
}
qsort(str, n, sizeof(int), cmp);
for (int i = 0; i < n; i++)
for (int j = n-1; str[i] && j > i; j--) {
if (!str[j]) continue;
if (str[i] + str[j] <= l) {
str[i] = str[j] = 0;
cnt++;
break;
}
}
for (int i = 0; i < n; i++)
if (str[i] != 0) cnt++;
printf("%d\n", cnt);
if (T) printf("\n");
}
return 0;
}