#include<iostream>
#include<algorithm>
using namespace std;
int main() {
long long n, p;
cin >> n >> p;
long long arr[100001];
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
sort(arr, arr + n);
long long min;
long long maxLen = 0;
for (int j = 0; j < n; ++j) {
min = arr[j];
int i;
for (i = j + 1; i < n; ++i) {//顺序查找
if (min * p < arr[i]) {
if ((long long)i - (long long)j > maxLen) {
maxLen = (long long)i - (long long)j;
}
break;
}
}
if (i == n) {
if ((long long)i - (long long)j > maxLen) {
maxLen = (long long)i - (long long)j;
}
}
}
cout << maxLen;
return 0;
}
method-2
二分查找
#include<iostream>
#include<algorithm>
using namespace std;
int bSearch(long long arr[],int L,int R,long long key){
while(L<=R){
int mid = (L+R)/2;
if(arr[mid] == key){
return mid;
}else{
if(arr[mid]<key){
L = mid+1;
}else{
R = mid-1;
}
}
}
return R;//分两种情况,若找到key,返回的是key的下标,若找不到key,则返回的是小于key的元素的下标,都恰好是我们想要的
}
int main() {
long long n, p;
cin >> n >> p;
long long arr[100001];
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
sort(arr, arr + n);
long long min;
long long maxLen = 0;
for (int j = 0; j < n; ++j) {
min = arr[j];
int i = bSearch(arr,j,n-1,p*min);
if(i-j+1>maxLen){
maxLen = i-j+1;
}
}
cout << maxLen;
return 0;
}
example1https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224method-1顺序查找,效率低有一个测试用例超时了#include<iostream>#include<algorithm>using namespace std;int main() { long long n, p; cin >> n >> p;