#include <bits/stdc++.h>
using namespace std;
int main()
{
int N, p;
cin >> N >> p;
vector<int> v(N);
for (int i = 0; i < N; i++)
{
cin >> v[i];
}
sort(v.begin(), v.end());
int maxCount = 1; // 记录满足条件的最大数量
for (int left = 0; left < N; left++) {
int right = left + maxCount; // 右指针位置
if (right >= N) {
break; // 右指针越界,结束循环。注意!这一步很容易被忽视
}
while (right < N && v[right] <= (long long)v[left] * p) { //这里的(long long)是最后的陷阱,因为int的数据容量是2的32次(或31次)-1,也就是4294967295(或2147483647),是一个十位数,正好满足了题目10的9次的要求,但v[left] * p就有可能会超出,所以需要强转为(long long),否则会扣去两分
maxCount = max(maxCount, right - left + 1);
right++;
}
}
cout << maxCount << endl;
return 0;
}
本题在第一次写时入了坑,遍历部分是这样写的:
for(int i=1;i<N;i++){
if(v[0]*p>=v[i]){
continue;
}else{
I=i-1;
break;
}
}
当时的想法是最小值就是升序后的第一个,这样直接往后找最大就行,但事实上整个完美区间应该是可以整个往后移动的,比如当p=8时,数组1 2 3 8 9 10 11 12 13 14 15 16,按原代码的逻辑,以1为最小值,得到的结果为4,但若以2为最小值,得到的正确结果为11。需要多加注意。