There are nn programmers that you want to split into several non-empty teams. The skill of the ii -th programmer is aiai . You want to assemble the maximum number of teams from them. There is a restriction for each team: the number of programmers in the team multiplied by the minimum skill among all programmers in the team must be at least xx .
Each programmer should belong to at most one team. Some programmers may be left without a team.
Calculate the maximum number of teams that you can assemble.
Input
The first line contains the integer tt (1≤t≤10001≤t≤1000 ) — the number of test cases.
The first line of each test case contains two integers nn and xx (1≤n≤105;1≤x≤1091≤n≤105;1≤x≤109 ) — the number of programmers and the restriction of team skill respectively.
The second line of each test case contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤1091≤ai≤109 ), where aiai is the skill of the ii -th programmer.
The sum of nn over all inputs does not exceed 105105 .
Output
For each test case print one integer — the maximum number of teams that you can assemble.
Example
Input
Copy
3
5 10
7 11 2 9 5
4 8
2 4 2 3
4 11
1 3 3 7
Output
Copy
2
1
0
首先要把原序列排序。然后就是从小到大排序还是从大到小排序的问题。如果从小到大的话,受限于前面的元素,如果前面的元素很小的话,比如a[1] = 1, x = 100,就浪费了很多大的元素,因此需要从后往前来凑组。用变量记录当前组的成员数,当前组最小值以及答案,O(n)扫一遍即可。
#include <bits/stdc++.h> using namespace std; int n, x, a[100005]; int main() { int t; cin >> t; while(t--){ cin >> n >> x; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a + 1, a + n + 1); int ans = 0, cnt = 1, mmin = a[n]; for(int i = n - 1; i >= 0; i--){ if(mmin * cnt >= x){ ans++; mmin = a[i]; cnt = 1; } else{ mmin = a[i]; cnt++; } } cout << ans << endl; } return 0; }