这题应该很容易就想到贪心,然后通过观察数据量就知道了如果用暴力会超时,所以这里用二分,博主懒,用了STL的upper_bound,(输出时格式注意下,博主第一次WA)不多说,上代码,不懂的看注释吧
//
// main.cpp
// B - 装箱
//
// Created by wenhan on 2017/8/14.
// Copyright © 2017年 wenhan. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
int a[100000+5];
using namespace std;
int main() {
vector<int> me;
vector<int>::iterator it;
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);//现将数据读进来存a中
sort(a+1, a+n+1);//a排序,之后从大到小贪心
int s=0;//计数器
for(int i=n;i>=1;i--)
{
it=upper_bound(me.begin(), me.end(), m-a[i]);//寻找大于m-a[i]的位置,也就是说物体越小找到的位置越后,切记不可用lower_bound,原因自己想一下吧
if(it!=me.begin())//存在比m-a[i]大的
{
me.erase(it-1);//从vector里删去找到位置的前一项,因为之前都放的下
}
else//找不到则将数据插入头部,计数器+1
{
me.insert(it, a[i]);
s++;
}
}
printf("%d\n",s);
if(t!=0)//注意格式
printf("\n");
me.clear();//一定要及时清理
}
// insert code here...
//std::cout << "Hello, World!\n";
return 0;
}