题目:
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
思路:这题就类似滑块的方式来组合排列。确定数列的开头后,滑动改变数列的结尾,同时判断head和tail是否符合完美数列,符合就
更新step的值,step=j-i+1是head和tail之间的距离,因为中间的数字组成的完美数列不可能是最多的所以下一次循环要选择性的跳过。
注意:在我调试的时候,第四个测试点运行超时是因为测试数据太大,所以得加一个break跳过不必要的循环
第五个测试点是因为我的p的数据范围太小,大数据会让p的值溢出,所以改用long long。
代码:
#include<iostream> #include<algorithm> using namespace std; int main() { int N = 0, step = 0; long long p = 0; cin >> N >> p; int *arry=new int[N]; if (N > 100000)return 0; for (int i = 0; i < N; i++)cin >> arry[i]; sort(arry,arry+N); for (int i = 0; i < N; i++) { for (int j = i + step; j < N; j++) { if (arry[j] <= arry[i] * p)step = j - i + 1; else break; } } cout << step << endl; return 0; }