PTA 1030 完美数列 (25 分) c++实现
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤10^5)是输入的正整数的个数,p(≤ 10^9 )是给定的参数。第二行给出 N 个正整数,每个数不超过 10^9。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
解题思路:
先对输入的数进行从小到大的排序,设置mp,遍历这个排序后的数组,找到第一个大于mp的数,并记录他的下标,那么包括它在内的它之前的所有的数所构成的数组,就是满足数量最大的数组。(tips:如果这个排序后的数组的最后一个数,也就是此时此刻这个数组的最大值都小于等于mp的时,那么这组数所构成的数组就是满足最大数量的数组,不必继续遍历数组了)
代码示例:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
long long int n, p;
cin >> n >> p;
vector<long long int> nums;
for (int i = 0; i < n; i++)
{
long long int temp;
cin >> temp;
nums.push_back(temp);
}
sort(nums.begin(), nums.end()); //从小到大排序
vector<int> res; //用于存储每次满足条件的数组的大小
int j = 0;
for (long long int i = 0; i < nums.size(); i++)
{
long double pro = (long long int)nums[i] * p;
if (nums[n - 1] <= pro)
{
res.push_back(n - i);
break;
}
for (; j < nums.size(); j++)
{
if (nums[j] > pro)
{
res.push_back(j - i);
break;
}
}
}
//输出满足条件数组大小的最大值即可
cout << *max_element(res.begin(), res.end());
}