这么简单的题目搞了半天唉气死我了,讲一讲自己踩过的坑。
- 在二分查找中,千万不能够出现
left = mid
这样的代码,因为mid = (left +right)/2
,这样就可能出现比如left=8 && right=9然后mid=8然后left=mid就陷入死循环了。 - 在寻找第一个比target大的数的时候,一定要加一句判断,最大的数是不是比target小。不然的话,返回的数依然是一个比target小的数,在计算长度的时候就会小1.
- 少用long long,在范围之内尽量用int,再用upper_bound的时候因为long long用的多相乘的时候出现了莫名其妙的错误。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cstdio>
#include <map>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 100010;
int c[maxn];
int main()
{
int n,i,j,p;
scanf("%d %d",&n, &p);
for(i=0;i<n;i++)
scanf("%d", &c[i]);
sort(c, c+n);
int per = 1;
long long target;
int left,right,mid;
for(i=0;i<n;i++)
{
target = p*c[i];
left = i;
right = n-1;
while(left<right)
{
if(c[right]<=target)
{
left = n;
break;
}
mid = (left + right)/2;
if(c[mid]<=target)
left=mid+1;
else
right=mid;
}
//j = upper_bound(c + i + 1 , c + n , (long long)target) - c;
//per = max(per, j - i);
per = max(per, left - i);
}
printf("%d", per);
return 0;
}