```cpp
/*
箱子打包
每个箱子最多放两个物品
n个物品 求最小的箱子总数
思路:
每次只装一个箱子,选最大和最小的装箱,若溢出则只装最大的物品
*/
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAXN = 1e5+10;
int length[MAXN];
int main()
{
int n,l;
scanf("%d%d",&n,&l);
for(int i = 0;i < n; ++i){
scanf("%d",&length[i]);
}
sort(length,length+n);
int left = 0;
int right = n-1;
int sum = 0;
while(left <= right){
if(length[left] + length[right] <= l){
left++;
right--;
}
else{
right--;
}
sum++;
}
printf("%d",sum);
return 0;
}