链接: link.
贪心我们一般会想到排序,不过这道题还得用上双指针才能过,双指针能大大减少时间复杂度
将n个数从小到大排序后,右指针向左遍历,如果指到的数大于等于k,就能一个人组成一个team ,否则的话,左指针向右走,如果当前a[r]+a[l]<k 的话,右指针不动,左指针继续向右走,那些左指针已经走过的数,左指针左边的数,不包括左指针当前指的数,没用过的就已经没有用的价值了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t,n,k;
cin>>t;
while(t--){
cin>>n>>k;
int a[n];
int team=0;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int l=0,r=n-1;
while(l<=r){
if(a[r]>=k){
team++;
r--;
}
else if(a[l]+a[r]>=k&&l!=r){
team++;
r--;
l++;
}
else{
l++;
}
}
cout<<team<<endl;
}
}