大体题意:
给你n个物品,每个物品会告诉你重量,再告诉你背包的最大容量m,并且每个背包最多装两个物品(即使重量有剩余),问装完n个物品至少需要多少个箱子
思路:
先给n个重量拍个序,然后变量l 枚举左边,变量r 枚举右边。
当a[l] + a[r] <= m 即当前组合符合条件时,++ans,并且l ++ ,r --
当不符合时肯定把大的重量装进去了,这时只需要r--, ++ ans 即可!
最后输出ans
循环条件是l <= r
感觉有滑动窗口的味道 就这么叫了= = !
教训:
以后做题思路想清楚了再做,因为忘了排序错了两遍!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e+5 + 10;
int a[maxn];
int main(){
int T,cnt = 0;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
if (cnt++)printf("\n");
for (int i = 0; i < n; ++i)scanf("%d",&a[i]);
sort(a,a+n);
int ans = 0,l = 0,r = n-1;
while(l <= r){
if (a[l] + a[r] <= m){
--r;
++l;
}else --r;
++ans;
}
printf("%d\n",ans);
}
return 0;
}