https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224
这是我见过的最简单的第五题。
方法一全对了,但是方法二测试点4永远超时。
方法一:从左到右找到最后一个符合的点。
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n, p, max=0, j=0;
cin >> n >> p;
long int num[n];
for(int i=0; i<n; i++)
cin >> num[i];
sort(num, num+n);
for(int i=0; i<n; i++) {
// 注意这个j每次都从上次的位置开始移动
while(num[i]*p >= num[j] && j<n)
j ++;
if(max < j-i)
max = j-i;
}
cout << max;
return 0;
}
方法二:从右到左找到第一个符合的点。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
long int n, p, max=0;
cin >> n >> p;
long int num[n];
for(int i=0; i<n; i++)
cin >> num[i];
sort(num, num+n);
for(int i=0, j=n-1; i<n-max; i++,j=n-1){
while(num[i]*p<num[j] && j>=i+max)
j--;
if(max < j-i+1)
max = j-i+1;
}
cout << max;
}
本文介绍了两种C++方法来解决在排序数组中查找特定条件的最长连续子数组。方法一是从左到右扫描,找到最后一个符合条件的点;方法二是从右到左扫描,寻找第一个符合的点。然而,方法二在测试点4上出现超时问题。代码实现包括了对输入数组的排序,并使用滑动窗口的概念来优化搜索过程。
431





