给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 10^9。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
我的代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n, p;
scanf("%d %d", &n, &p);
int count = n;
auto *list = new long long[n];
for (int i = 0; i < n; ++i) scanf("%lld", &list[i]);
sort(list, list + n);
while (count != 1) {
for (int i = 0; i + count <= n; ++i) {
if (list[i + count - 1] <= list[i] * p) {
printf("%d", count);
return 0;
}
}
count--;
}
printf("%d", count);
return 0;
}
该代码使用滑块的方法,滑块窗口初始大小为数组长度。在数组用sort排序后,滑块在数组上的左右限即为最小值和最大值。如果满足条件,输出此时的窗口大小并退出程序;如果不满足条件,则移动滑块再次判断。如果当前窗口大小下都不满足条件,则减小滑块,重复上述过程。
我认为该方法虽然说不上优秀,但也算有亮点吧,特别是第一次满足条件时滑块窗口大小即为所求,然后输出并退出程序节约时间。但偏偏测试点4(大数据量的一个测试)运行超时。后来又在牛客网试了一下,也是有一个测试点运行超时。
我觉得超时的原因无非是,该方法在结果接近组数长度的时候耗时较小,一旦数据量很大或者结果很小,耗时就激增。但怎么改进呢?我试过当p为1的时候直接输出1,试图蒙混过关,但测试点4任然超时/(ㄒoㄒ)/~~
如果有大佬帮忙解答一二的话,实在不胜感激!