最大化问题,我还写了半天,真的是有点不熟练了,然后要注意的是每次二分前要先记录一下左端点的值,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int maxn = 1e5 + 5;
int n, p, ans;
ll m;
ll a[maxn];
bool check(int x) {
return a[x] <= m * p;
}
void solve(int l, int r) {
int cnt = l;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
ans = max(ans, l - cnt + 1);
}
int main() {
cin >> n >> p;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
for (int i = 0; i < n; i++) {
m = a[i];
solve(i, n - 1);
}
cout << ans;
return 0;
}