题源https://pintia.cn/problem-sets/994805260223102976/exam/problems/994805291311284224
关键:
测试点4:超时问题。两层循环需减少不必要的循环
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <iomanip>
#define MAX_SIZE 100000
using namespace std;
int main() {
int n, p;
cin >> n >> p;
long long a[MAX_SIZE];
for(int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
int ans = 0;
for(int i = n - 1; i >= ans; i--) {
int m = ceil((double)a[i]/p); // 满足M<=mp的m可取的最小值
if(m <= a[i - ans]) {
int j;
for(j = 0; j <= i - ans; j++) {
if(a[i] <= a[j] * p || j == n - 1) {
j--;
break;
}
}
// if(j < 0) j = 0;
ans = i - j;
}
}
cout << ans;
}