原题连接,点击进入
下面是我没有敲出ac的代码,直到写完博客前我也没有发现我的代码的纰漏在哪里。会有两个情况会出现wrong answer。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int search(long long group[],int a,int number,long long p) {
int right, left, mid;
left = a + 1;
right = number - 1;
long long target = group[a] * p;
if (target >= group[right])
return right;
while (left < right) {
mid = left + (right - left) / 2;
if (target >= group[mid])
left = mid + 1;
else
right = mid;
}
return left;
}
int main() {
int number = 0;
int ans = 1;
long long group[100010] = { 0 };
long long p = 0;
cin >> number >> p;
for (int i = 0; i < number; i++) {
scanf("%d", &group[i]);
}
sort(group, group + number);
for (int i = 0; i < number ; i++) {
int j = search(group, i, number, p);
ans = max(ans, j - i);
}
cout << ans ;
}
下面是《算法笔记》给出的参考代码,是ac的。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int n, p, a[maxn];
int binarySearch(int i, long long x) {
if (a[n - 1] <= x)
return n;
int l = i + 1, r = n - 1, mid;
while (l < r) {
mid = (l + r) / 2;
if (a[mid] <= x) {
l = mid + 1;
}
else {
r = mid;
}
}
return l;
}
int main() {
scanf("%d%d", &n, &p);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, a + n);
int ans = 1;
for (int i = 0; i < n; i++) {
int j = binarySearch(i, (long long)a[i] * p);
ans = max(ans, j - i);
}
printf("%d\n", ans);
return 0;
}
日后如果发现源代码有什么纰漏再更新。