给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
结尾无空行
输出样例:
8
结尾无空行
解题思路:第一次做25分的题,题目理解起来较为容易,数据读取也不是很复杂,得注意的是如果输入的数据范围在10的9次方时,就需要使用longlong来定义这个变量了,这个得注意,在下面的做题中,需要考虑的点是不是从最小的数开始统计就一定是最小的,这个是错误的,得全部试验才能知道,在下面的遍历中我学习了柳神的遍历方法,大大的减少了需要统计的重复数据,由于上次的统计可知上次满足条件的最后一个数一定满足下次开始的第一个数,所以下次直接从上次结束的下一个位置开始统计,最后比较结果进行统计然后输出就好了。
//M <= mp是完美数列
//读懂了,就是先排序然后找最大满足条件的值
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int number = 0;
long long interface = 0;//number为要输入的数,interface是参数
cin >> number >> interface ;
vector<int>arr;
for(int i = 0; i < number ; ++i)
{
int middle = 0;
cin >> middle;
arr.push_back(middle);
}
sort(arr.begin(),arr.end());
int end = 0,temp = 0;//最后的结果
for(int i = 0 ; i < arr.size() ; i++)
{
for(int j = temp + i;j < arr.size(); j++)
{
if(arr[j]<=arr[i]*interface)
{
end = j - i +1;
if(temp < end)
temp = end;
}
else
break;
}
}
cout << temp<<endl;
return 0;
}